在 Python 中,如果给出错误的参数,则返回“None”而不是创建新实例

use*_*426 4 python class instance

创建类的实例时,如果给出了错误的参数。我怎么办?不创建一个新实例并返回引用,而是只返回一个“无”

这是我的应用程序:因为它有时被允许。我的应用程序是从整数列表构建树。我想在列表中使用 None 来表示一片叶子。所以我只想返回一个 None 而不是一个空的树节点。

Dev*_*vin 6

这些答案大部分都不对。执行此操作的适当方法是在类的__new__方法中验证您的参数,并None在验证失败或ins验证成功时返回。

这就是你要找的:

import pytest # for testing


class ValidatedModel:
    def __init__(self, *, name=None):
        self.name = name

    @classmethod
    def _validate(cls, *args, **kwargs):
        try:
            assert not args
            assert list(kwargs.keys()) == ['name']
            assert len(kwargs['name']) > 5 and len(kwargs['name']) < 10
        except AssertionError:
            return False
        return True

    def __new__(cls, *args, **kwargs):
        if cls._validate(*args, **kwargs):
            return super().__new__(cls)


class TestValidatedModel:
    def test_success(self):
        vm = ValidatedModel(name='william')
        assert isinstance(vm, ValidatedModel)

    def test_kwarg_fail_unexpected_kwarg(self):
        vm = ValidatedModel(name='william', gender='M')
        assert vm is None

    def test_kwarg_fail_name_length_short(self):
        vm = ValidatedModel(name='bill')
        assert vm is None

    def test_kwarg_fail_name_length_long(self):
        vm = ValidatedModel(name='william johnson')
        assert vm is None

    def test_no_name_kwarg(self):
        vm = ValidatedModel()
        assert vm is None
Run Code Online (Sandbox Code Playgroud)

显然,您可以用_validate自己的实现替换该方法。


hru*_*ing 4

请参阅Python return failure to create 的答案__init__

基本上,您可以使用它__new__来完成您想要的事情,但实际上,执行此操作的 Python 方式是抛出异常。可以说,Pythonic 方法是有一个更简单的__init__方法,它只是一个初始化,并且根本不会失败。