通过在格式方法中使用解包kwargs来实现密钥冲突

时间:2017-05-19 19:16:53

标签: python python-3.x

我想用unpack kwargs格式化方法打印一个字符串。但是对于性别输入,需要使用一个字典进行映射。我能找到的唯一方法是创建一个字典并使用不同的密钥。但它似乎不是一个好方法。不过吗?

def func(**kwargs):
    _m = {'h': 'he', 's': 'she'}
    print('This is {name}. {gender} is a {position}'.format(gender=_m[kwargs['sex']], **kwargs))


#correct
func(name='Jon', sex='h', position='Engineer')
#correct
func(name='Jon', sex='s', position='Engineer')
#incorrect
func(name='Jon', gender='s', position='Engineer')

1 个答案:

答案 0 :(得分:1)

首先,如果您在上一个示例中使用了代码,那么您将获得sex,因为您没有传递一个_m参数,而该参数是您尝试从内部kwargs检索的。 1}} dict。

使用您想要的任何本地数据更新gender dict并仅使用def func(**kwargs): _m = {'h': 'he', 's': 'she'} kwargs["gender"] = _m[kwargs["gender"]] print('This is {name}. {gender} is a {position}'.format(**kwargs)) 属性,例如:

,这没有任何问题。
def func(**kwargs):
    replacements = {"gender": {"h": "he", "s": "she"}}
    for field in replacements:
        kwargs[field] = replacements[field].get(kwargs.get(field, None), None)
    print('This is {name}. {gender} is a {position}'.format(**kwargs))

您还可以通过创建dict映射来更新多个字段:

replacements

然后,您可以根据传递的参数,使用尽可能多的字段填充replacements dict。

如果未传递默认值,您甚至可以声明默认值,例如,如果replacements = {"gender": {"h": "he", "s": "she", None: "it"}} dict设置为:

gender

使用缺少func(name='Robot', position='Engineer') # This is Robot. it is a Engineer 属性的调用将导致:

{{1}}