我有一个程序,首先分析几个参数,其中一个是“ verbose”标志。但是,我还有一个“模拟”标志,如果启用该标志,我希望将详细标志自动翻转为“真”。
现在我正在工作:
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”?
答案 0 :(得分:5)
问题不在于or
,而是您需要一个else
子句来指定if
语句失败时的值。否则,如果条件为假,将分配什么?
verbose = True if args.verbose or simulate else False
不过,根本不需要if
。如果您直接将测试结果直接分配给verbose
,则更加简单:
verbose = args.verbose or simulate
答案 1 :(得分:1)
在功能上等效的 表达式为:
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
设置为{{ 1}})。
但是,如果已知Simulator和False
都是布尔值,则可以使用:
verbose
如果已知最初将verbose = arg.verbose or simulate or verbose
设置为verbose
:
False
就足够了。在这种情况下,我们可以跳过先前verbose = arg.verbose or simulate
的初始化(假设在此处的初始化和设置之间未使用它)。