在Python中,如何确保只有一个值为真?

在Python中,如何确保只有一个值为真?,python,python-3.x,Python,Python 3.x,用户可以向web API提供X个查询参数,例如: 帕拉姆 帕拉姆 参数c param_a = self.req.params.get('param_a', None) param_b = self.req.params.get('param_b', None) param_c = self.req.params.get('param_c', None) 如果未提供给定的查询参数,则其值为None 它们必须提供至少一个且不超过一个或多个参数 在Python3中,什么是确认至少提供了一个且不超过一

用户可以向web API提供X个查询参数,例如:

帕拉姆

帕拉姆

参数c

param_a = self.req.params.get('param_a', None)
param_b = self.req.params.get('param_b', None)
param_c = self.req.params.get('param_c', None)
如果未提供给定的查询参数,则其值为None

它们必须提供至少一个且不超过一个或多个参数

在Python3中,什么是确认至少提供了一个且不超过一个参数的有效方法?

将它们加起来

sum(x is not None for x in (param_a, param_b, param_c)) == 1

由于
True
的值为
1
,因此总和将是非
None

@Ignacio Vazquez Abrams有一个不错的答案。您还可以检查筛选列表的长度:

if len([p for p in (param_a, param_b, param_c) if p]) != 1:
    print("Invalid.")
如果您碰巧有一个参数列表,则会更短:

if len([p for p in params if p]) != 1:
    print("Invalid.")
有多少套? 列出所有已设置的,并查看其长度:

len([p for p in (param_a, param_b, param_c) if p != None]) == 1
这就像Ignacio的答案一样,但这并不依赖于隐式地将True转换为整数,然后求和,因此我认为更清楚的是,要找到列表的长度,而不是任何东西的总和


[按照@pm-2ring的建议进行编辑,以处理诸如
?a=foo&b=&c=bar等查询字符串可以合理地变成
b='
,并且我的原始检查将
b
计算为“未设置”而不是“设置为空字符串”].

我喜欢这个答案的简洁,尽管我不得不承认,我发现在略读中理解逻辑有点困难。i、 e.“x不是无”实际上意味着这是一个列表理解,看起来像[x对于(a,b,c)]中的x不是无,返回[True,False,True]。我喜欢它的工作方式,但我只是说它不是一目了然的,因为我不是超级聪明,我倾向于寻找一目了然的代码。我可以同意你的解决办法。[(x不是无)对于(a,b,c)]中的x更容易理解。你可以用
Java
c#
等其他语言编写
[(x不是无)对于(a,b,c)]
,但不应该用Python编写。在我看来,像伊格纳西奥的回答这样的形式是最好的opinion@julivico有趣的是,我会认为显式比隐式好,我发现“(x不是无)”周围的括号更显式。我想这只是个人喜好。@Duke:是的,你说得对。但别忘了
简单比复杂好
,可能是
扁平比嵌套好。我想,伊格纳西奥的密码已经很清楚了。每个人都可以写,他感觉如何最好。我只想说出我的观点。如果参数可以有虚假的ish值,如0、、[]等,那就行不通。如果参数可以有虚假的ish值,如0、、[]等,那就行不通了。同意,但这是一个web API,HTTP请求的参数肯定都是文本?嗯,好的。但空字符串可能是一个有效参数,可能需要与
None
@PM2Ring Good point区别对待;最新答案