我创建了一些课程,
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
值,实际上不再是可选的?
答案 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)