如果N个变量中有一个以上为真,则使用Python

如果N个变量中有一个以上为真,则使用Python,python,function,if-statement,argument-passing,Python,Function,If Statement,Argument Passing,我需要检查是否定义了a、b、c和d中的多个: def myfunction(input, a=False, b=False, c=False, d=False): if <more than one True> in a, b, c, d: print("Please specify only one of 'a', 'b', 'c', 'd'.) def myfunction(输入,a=False,b=False,c=False,d=False): 如果在a、b、

我需要检查是否定义了a、b、c和d中的多个:

def myfunction(input, a=False, b=False, c=False, d=False):
    if <more than one True> in a, b, c, d:
    print("Please specify only one of 'a', 'b', 'c', 'd'.)
def myfunction(输入,a=False,b=False,c=False,d=False):
如果在a、b、c、d中:
打印(“请仅指定“a”、“b”、“c”、“d”中的一个”。)
我目前正在嵌套if语句,但这看起来很可怕。您能提出更好的建议吗?

尝试添加值:

if sum([a,b,c,d]) > 1:
    print("Please specify at most one of 'a', 'b', 'c', 'd'.")
这是因为布尔值继承自
int
,但如果有人传递整数,则可能会被滥用。如果这是一种风险,则将它们全部转换为布尔值:

if sum(map(bool, [a,b,c,d])) > 1:
    print("Please specify at most one of 'a', 'b', 'c', 'd'.")
或者,如果您希望恰好有一个标志为
True

if sum(map(bool, [a,b,c,d])) != 1:
    print("Please specify exactly one of 'a', 'b', 'c', 'd'.")

首先想到的是:

if [a, b, c, d].count(True) > 1:

如果您只需要1个真值:

 def myfunction(input, a=False, b=False, c=False, d=False):
    if filter(None,[a, b, c, d]) != [True]:
        print("Please specify only one of 'a', 'b', 'c', 'd'.)")

由于
int(True)
始终为1,这将起作用,为什么要进行下一票?+1.检查括号。我没有进行下一票,但是
sum([a,b,c,d])!=1在所有值都为false的情况下也是真的。这与OP希望的“检查是否有多个值”的逻辑略有不同“行为”。@Kevin,是真的,但很容易修复。可能需要一个不同的函数签名。如果允许用户只做一个选择,那么
def myfunction(input,choice)
如何,其中
choice
是“a”、“b”、“c”、“d”中的一个;返回any(it)和any(it)
用法:
如果有多个值为真(a、b、c、d):…
@Martijn Pieters-副本在哪里?@TheChymera您正在测试反向以返回错误消息;其他的测试是否有一个是真的。是的,我不认为倒数是重复的。此外,这甚至不仅仅是相反的,标题意味着他正在测试一个或两个。正如你可以清楚地看到的,下面的答案与他得到的答案不太相似。我认为在PyCon 2014上,一位发言者说这是检查这一点的正确方法,并明确表示sum是错误的方法。我记得那是一个很受尊敬的人。我希望我记得细节