我有一个程序,它从解析几个参数开始,其中一个是"verbose"标志。然而,我也有一个"模拟"标志,如果它打开,我想自动将详细标志翻转为"True">
现在我有这个工作:
if args.verbose or simulate:
verbose = True
我怎样才能把这个放到一条线上?我希望能够做一些类似的事情:
verbose = True if args.verbose or simulate
或类似:
verbose = True if (args.verbose or simulate)
在这里搜索时,我发现了一个适合一行的解决方案:
verbose = (False, True)[args.verbose or simulate]
然而,我发现这个解决方案比我希望能奏效的其他解决方案可读性差得多。这可能吗,而我只是错过了什么?或者不可能在一行中使用两次检查之间的"或"来表示"True"吗?
问题不在于or
,而是需要一个else
子句来指定if
语句失败时的值。否则,如果条件为false,将分配什么?
verbose = True if args.verbose or simulate else False
不过,根本不需要if
。如果你直接将测试结果分配给verbose
,那就更简单了:
verbose = args.verbose or simulate
功能等效的表达式为:
verbose = True if args.verbose or simulate else verbose
因为verbose
可能已经是True
,或者其他东西(数字、列表、字典等(
此外,如果我们不确定arg.verbose
和simulate
是布尔值,我们就不能使用:
verbose =arg.verbose or simulate
因为如果例如simulate
是[1]
,那么我们得到:
>>> False or [1]
[1]
然而,我们可以将此表达式转换为布尔值,如:
verbose = bool(arg.verbose or simulate) or verbose
在条件为False
的情况下,我们将verbose
分配回verbose
(因为verbose
也可能被设置为False
以外的其他值(。
然而,如果知道simulate和verbose
都是布尔值,我们可以使用:
verbose = arg.verbose or simulate or verbose
如果已知verbose
最初已设置为False
:
verbose = arg.verbose or simulate
就足够了。在这种情况下,我们可以跳过verbose
的上一次初始化(假设在初始化和此处设置之间没有使用它(。