Python if key in kwargs and key is true

Mat*_*att 2 python dictionary conditional-statements

if 'force' in kwargs and kwargs['force'] is True:
Run Code Online (Sandbox Code Playgroud)

It feels like there should be a better way of writing this condition since I'm repeating both the key and variable.

Ric*_*ica 6

假设你真的想检查返回的关键字参数is True,这里有另一种稍微不同的方法:

if kwargs.get('force', False) is True:
Run Code Online (Sandbox Code Playgroud)

我认为添加False论点对读者来说更加明确/清晰。

使用上面的get方法,该方法返回的每个值都会导致该子句被跳过,除非它包含一个值True

然而,在将类型转换为布尔值时,Python 非常好 - 通常根本不需要显式检查is True. 如果是这种情况,您可以简单地执行以下操作:

if kwargs.get('force', False):
Run Code Online (Sandbox Code Playgroud)

这样做,该语句if False仅在少数情况下会减少到。以下是其中一些(可能不是全部 - 尽管文档说这涵盖了所有这些):

  • False
  • None - Python 的空值
  • [], (), {}, set()- 一个空容器,如list, tuple, dict, 或set
  • ''""- 一个空字符串
  • 0, 0.0- 任何等于零的数字
  • 用户定义类的实例,如果该类定义了一个__bool__()or__len__()方法,当该方法返回整数零或 bool 值时False

在这种情况下,该get方法返回的每个值都将导致该子句被执行,除非它包含一个评估为 的值False,例如上面的示例之一。任何其他值都将评估为True。(旁注:包含的计算结果为值的容器False仍然评估为True,例如,[None, None](0, 0){False, False};这可以是意外对于没有经验的Python用户)。

如果您希望在您检查它的时间点添加kwargs值为的键False

if kwargs.setdefault('force', False):
Run Code Online (Sandbox Code Playgroud)


Eth*_*ein 5

虽然@EmanuelePaolini提供了一个很好的答案,但我还想挑剔另一件事。您无需检查某事是否属实。例如,您的代码块将变成这样:

if 'force' in kwargs and kwargs['force']:
Run Code Online (Sandbox Code Playgroud)

@EmanuelePaolini 的解决方案将变成这样:

if kwargs.get('force'):
Run Code Online (Sandbox Code Playgroud)