【问题标题】:Python if key in kwargs and key is truePython 如果 kwargs 中的键和键为真
【发布时间】:2015-10-19 10:43:20
【问题描述】:
if 'force' in kwargs and kwargs['force'] is True:

感觉应该有更好的方式来写这个条件,因为我在重复键和变量。

【问题讨论】:

  • if kwargs.get('force', False):,也许吧? (get 上的文档:tutorialspoint.com/python/dictionary_get.htm
  • @NightShadeQueen 否,因为如果在 kwargs 中找到 'force'kwargs.get('force', False) 将返回 False
  • 不,如果 'force' 不在 kwargs 中,它只会返回 False。例如{'a':'b'}.get('a', False) 返回'b'

标签: python conditional-statements dictionary


【解决方案1】:

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

if kwargs.get('force', False) is True:

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

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

然而,Python 在将类型转换为布尔值方面非常出色 - 通常根本不需要显式检查 is True。如果是这种情况,您可以简单地这样做:

if kwargs.get('force', False):

这样做,仅在少数情况下,语句会简化为 if False。以下是其中一些(可能不是全部 - 尽管the docs says 涵盖了所有这些):

  • False
  • None - Python 的空值
  • [](){}set() - 一个空容器,例如 listtupledictset
  • ''"" - 一个空字符串
  • 00.0 - 任何等于零的数字
  • 用户定义类的实例,如果该类定义了__bool__()__len__() 方法,则当该方法返回整数零或布尔值False

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

如果您希望在检查时将密钥添加到 kwargs,其值为 False

if kwargs.setdefault('force', False):

【讨论】:

  • 这不等同于OP给出的条件。请参阅@Ethan Bierlein 上的 cmets 答案。
  • @EmanuelePaolini 从技术上讲,你是对的。然而,由于 OP 的声望很高,这是 OP 提出的第一个问题,标记为 Python,我推测 OP 可能是一个没有经验的 Python 用户。由于在 Python 中检查 is True 有点不寻常,所以我推断 OP 真正想做的是以通常的方式检查它。不过,我应该更明确地说明这一点。
  • @EmanuelePaolini 我进行了编辑以使我的假设更加明确。
【解决方案2】:

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

if 'force' in kwargs and kwargs['force']:

@EmanuelePaolini's 的解决方案会变成这样:

if kwargs.get('force'):

【讨论】:

  • 你怎么知道 OP 不需要检查某事是否为真?您提出的代码与 OP 提供的代码不等价。
  • @EmanuelePaolini OP 明确检查kwargs["force"] 是否为True,因此可以缩短。
  • 如果 kwargs['force'] == 1 条件 kwargs['force'] 满足,而 (kwargs['force'] is True) 不满足。
【解决方案3】:

更好的方法:

if kwargs.get('force') is True:

依赖于kwargs.get('force') is None if 'force' not in kwargs'.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-28
    • 2017-06-29
    • 2022-12-01
    • 2021-09-28
    • 2015-03-11
    • 2014-04-18
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多