【发布时间】:2014-06-27 17:40:58
【问题描述】:
我有一个一般性问题以及一个特定用例。
可选参数很简单:def func(a, b, c=None): ...,然后在正文中可能使用 c 的任何地方,只要先写 if c:,或者类似的东西。但是当需要某种参数组合时呢?一般情况是考虑存在或不存在精确参数的任意情况。对于函数def func(a, b, c=None, d=None, e=None, f=None): ...,这将包括一些愚蠢的事情,例如:提供 c 和 d 但不提供 e 和 f,或仅提供 e,或提供 c、d、e 和 f 中的至少 3 个。但我的用例不需要这样的通用性。
对于 def func(a, b, c=None, d=None): ...,我希望提供 c 和 d 中的一个。
我想到的解决方案包括:
- 在正文中,手动检查有多少 c 和 d 不是 None,如果不完全是 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 表示其中 e 代表哪一个。
前任。
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
这些会起作用,但是标准/公认/pythonic 的方法是什么?
【问题讨论】:
-
调用函数的用户如何知道哪些组合是可接受的?
-
我第二个@Mark 的问题。相反,您应该编写一个接受
a, b, cd=None的函数定义并测试cd以查看它是c还是d,然后采取相应措施。 -
FYI 在你的第一个例子中,说
sum(arg is not None for arg in [c,d])会更好看,但是 YMMV -
这是python 3吗?仅使用关键字 args 可以使答案更好一些。
-
可接受的组合将被记录(在我的例子中,在函数中的文档字符串中,但对于其他情况,可能在外部文档中)。除了阅读函数本身之外,用户不总是这样知道使用函数的细节吗?
标签: python optional-parameters