如何断言N个给定参数中的零或只有一个被传递

agi*_*liq 4 python

我有这样的定义

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)

但是有一些更简单的东西.

Sco*_*ths 9

怎么样:

 initialisers = [foo, bar, baz]
 if initialisers.count(None) < len(initialisers) - 1:
     raise Ex()
Run Code Online (Sandbox Code Playgroud)

它只计算None出现的数量.如果他们全部None或只有一个不是那么好,否则它会引发异常.


Ale*_*lli 6

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进行算术运算的能力就是其中之一,所以请随意使用它! - )