这可能与传统的* args ** kwargs范例有点不同:
我有一个数学函数,它将三个独立的参数作为输入,但是,它也可以通过指定三个中的任意两个来解决(非紧凑)。
目前,我有一个严格基于a和b的非紧凑解决方案,c作为可选约束:
def func(a,b,c=None):
if c is not None:
# do something with a, b, and c
else:
# do something with only a, b
return result
但是,我希望能够指定a,b或c中的任意两个,并且仍然保留指定所有三个的选项。最恐怖的做法是什么?
答案 0 :(得分:3)
您可以为它们提供None
的所有默认值,然后将参数作为关键字参数传递:
def foo(a=None, b=None, c=None):
print(a, b, c)
foo(a=123, b=456)
foo(a=123, c=789)
foo(b=456, c=789)
这个例子产生:
123 456 None
123 None 789
None 456 789
答案 1 :(得分:0)
替代方法:
def func(**kwargs):
p_keys = kwargs.keys()
if 'a' in p_keys and 'b' in p_keys:
# non-compact solution
if 'c' in p_keys:
# apply optional constraint
elif set(p_keys).issubset({'a', 'b', 'c'}):
# apply solution for 'any two'
else:
#complain loudly
pass
return