内联“ if”语句中的“或”布尔值

时间:2018-10-28 21:05:04

标签: python

我有一个程序,首先分析几个参数,其中一个是“ 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”?

2 个答案:

答案 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.verbosesimulate是布尔值,则不能使用:

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 的初始化(假设在此处的初始化和设置之间未使用它)。