我有一个一般性的问题,以及具体的使用情况。
可选参数是很容易的: def func(a, b, c=None): ...
然后在任何地方Ç可能在体内使用只写if c:
第一,或沿着这些线路的东西。 但对于何时参数的特定组合是必需的? 一般情况下是要考虑它的确切参数存在或不是任意的情况。 对于函数def func(a, b, c=None, d=None, e=None, f=None): ...
这将包括无聊的事情,如:提供c和d而不是E和F,或提供电子仅在或提供C,d,e和f的至少3。 但是我的使用情况下并不需要这样的普遍性。
对于def func(a, b, c=None, d=None): ...
,我要精确地设置一个c和d的。
我想过的解决方案包括:
- 在身,手动检查多少c和d都不是没有的,如果它不完全1,返回一个错误,说正好1需要指定
恩。
def func(a, b, c=None, d=None):
how_many_provided = len([arg for arg in [c, d] if arg]) # count the non-None optional args
if not how_many_provided == 1:
return "Hey, provide exactly 1 of 'c' and 'd'"
if c:
# stuff to do if c is provided
elif d:
# stuff to do if d is provided
-改变功能是def func(a, b, e, f): ...
其中e代表c或d和f指示哪个那些Ë中的一个表示。
恩。
def func(a, b, e, f):
if f == 'c':
# stuff to do if c is provided, with e as c
if f == 'd':
# stuff to do if d is provided, with e as d
这些工作,但标准是什么/接受/ Python的这样的方式?
你可以只使用关键字ARGS字典:
def func(a, b, **kwargs):
valid_args = len(kwargs) == 1 and ('c' in kwargs or 'd' in kwargs)
if not valid_args:
return "Hey, provide exactly 1 of 'c' and 'd'"
if 'c' in kwargs:
# stuff to do if c is provided
elif 'd' in kwargs:
# stuff to do if d is provided
我想说在您简单的情况下,您的用户最简单的方法就是重构,以独立的功能。 每个函数执行不同的工作描述,然后很常见的比如你的最后一宗个案
def funcC(a, b, c):
# stuff to do if c is provided, with e as c
common_func(a,b,c, None)
def funcD(a, b, d):
# stuff to do if d is provided, with e as d
common_func(a,b,None, d)
然后,用户知道哪些参数事项,只有合法的可能的组合都可以使用,用户不必猜测或有机会不正确地调用它们。 你作为提供功能可以提供任何需要的调用者没有提供参数。
还有通过google搜索“标志参数”发现的这些较长的解释如Martin Fowler的 堆栈溢出这些往往提布尔参数,但是这实际上同样的事情,不同的代码路径,这取决于有没有其他的效果相关的参数。
另一个成语是寻找“控制耦合”
这里是另外一个,这将允许指定的参数,并区分c=None
和c
没有给出,同时还提供了参数名明确:
undefined = object()
def func(a, b, c=undefined, d=undefined):
if (c is undefined) ^ (d is undefined):
raise TypeError("Hey, provide exactly 1 of 'c' and 'd'")
...
在Python 3中,仅关键字参数让它更漂亮,确保调用者明确指定c
或d
:
def func(a, b, *, c=undefined, d=undefined):
if (c is undefined) ^ (d is undefined):
raise TypeError("Hey, provide exactly 1 of 'c' and 'd'")