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

时间:2017-05-19 14:53:57

标签: python python-2.7 parameters parameter-passing optional-parameters

我创建了一些课程,

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值,实际上不再是可选的?

2 个答案:

答案 0 :(得分:2)

您可以记住属性中的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'])

我找不到这种情况的最佳例外,你可能想创建自己的。我可以使用RuntimeError

答案 1 :(得分:1)

您还可以在构造函数中定义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)