强制某些设置需要可选参数

2022-08-10 12:45:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一些类

class c:
    def __init__(self, mode=False):
        if mode:
            force foo to require optional_parameter

    def foo(self, optional_parameter=""):
        print("something %s" % optional_parameter)

如果用mode=True实例化类,调用方法时需要所有optional_parameter值,实际上不再是可选的,有没有办法?你知道吗


Tags: toselffalseifparameterfooinitmodedefrequireoptionalsomethingclassprintforce
2条回答
网友
1楼 ·

您可以记住属性中的mode,并检查是否传递了optional_parameter

class c:
    def __init__(self, mode=False):
        self.mode = mode

def foo(self, optional_parameter=""):
    if self.mode and optional_parameter == "":
        raise RuntimeError("optional_parameter must be passed")
    print("something %s" % optional_parameter)

你可以用字典解包来概括这一点:

def foo(self, **kwargs):
    if self.mode and 'optional_parameter' not in kwargs:
        raise RuntimeError("optional_parameter must be passed")
    print("something %s" % kwargs['optional_parameter'])

对于这种情况,我找不到最好的例外,您可能需要创建自己的例外。不过,我可以使用^{}。你知道吗

网友
2楼 ·

您还可以在构造函数中定义foo方法:

class C(object):
    def __init__(self, mode=False):
        self.mode = mode
        self.foo = (self._foo_mandatory if mode else
                    lambda optional_parameter="": self._foo_mandatory(optional_parameter))

    def _foo_mandatory(self, optional_parameter):
        print("something {0}".format(optional_parameter))

>>> c1 = C(False)
>>> c1.foo("Good")
something Good
>>> c1.foo()
something 

>>> c2 = C(True)
>>> c2.foo("Bad")
something Bad
>>> c2.foo()
Traceback (most recent call last):
  ...
TypeError: _foo_mandatory() takes exactly 2 arguments (1 given)