我有这样的定义
def bar(self, foo=None, bar=None, baz=None):
pass
Run Code Online (Sandbox Code Playgroud)
我想确保最多通过foo,bar,baz中的一个.我可以
if foo and bar:
raise Ex()
if foo and baz:
raise Ex()
....
Run Code Online (Sandbox Code Playgroud)
但是有一些更简单的东西.
怎么样:
initialisers = [foo, bar, baz]
if initialisers.count(None) < len(initialisers) - 1:
raise Ex()
Run Code Online (Sandbox Code Playgroud)
它只计算None出现的数量.如果他们全部None或只有一个不是那么好,否则它会引发异常.
x!=None对于Nones,返回True(其数值为1!)非Nones False(其数值为0).所以,
sum(x!=None for x in (foo, bar, baz))
Run Code Online (Sandbox Code Playgroud)
是把很多这些标识符如何被绑定到非无值(你可以检查计数对1就像其他的答案为做最简单的方法自己获得的计数方式).这是一种非常通用的方法,而不是x!=None你可以使用任何感兴趣的严格bool谓词; 例如,如果你有一堆整数,并想知道它们中有多少是3十进制表示的第一个数字,
sum(str(abs(x)).startswith('3') for x in (a, b, c, d, e))
Run Code Online (Sandbox Code Playgroud)
工作得很好.
不要对"总结bool"感到不安:Python bool被明确定义为int的子类,恰好有两个实例具有特殊的str/repr,但其他行为与普通的0和1完全相同.这有很好的实用理由设计和对bools进行算术运算的能力就是其中之一,所以请随意使用它! - )