首页 > 解决方案 > 当 .get 返回 None 时简化 if 条件

问题描述

是否可以简化这一点:

def method(self, **kwargs):
    if kwargs.get('profile_id') is None:
        kwargs['profile_id'] = 'something1'
    if kwargs.get('status') is None:
        kwargs['status'] = 'something2'
    if kwargs.get('account_type') is None:
        kwargs['account_type'] = 'something3'
    if kwargs.get('external_account_id') is None:
        kwargs['external_account_id'] = 'something4'
    if kwargs.get('vendor') is None:
        kwargs['vendor'] = 'something5'
    if kwargs.get('created_timestamp') is None:
        kwargs['created_timestamp'] = 'something6'

    return ClassOne.objects.create(**kwargs)

这行得通,但我只是好奇是否有更优雅的东西。我正在考虑做这样的事情:

kwargs['profile_id'] = kwargs.get('profile_id') or 'something1'

标签: pythonpython-3.xpython-2.7

解决方案


.get()有一个可选的第二个参数,它是默认值。

kwargs['profile_id'] = kwargs.get('profile_id', 'something1')

此外,您可以使用而不是调用get()您的if语句

if 'profile_id' not in kwargs:

请注意,这些解决方案不会替换None字典中的显式值。

您可以为所有字段使用默认字典,然后合并它们。

defaults = {"profile_id": "something1", "status": "something2", ...}
kwargs = {**defaults, **kwargs}

请参阅如何在一个表达式中合并两个字典?


推荐阅读