在内联"if"语句中"or"布尔值

  • 本文关键字:or 布尔值 语句 if python
  • 更新时间 :
  • 英文 :


我有一个程序,它从解析几个参数开始,其中一个是"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.verbosesimulate是布尔值,我们就不能使用:

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的上一次初始化(假设在初始化和此处设置之间没有使用它(。

最新更新