首页 > 解决方案 > 将字典值传递给函数,缺少键

问题描述

我有一个带有接收多个参数的构造函数的类。我从一个外部文件中获得这些参数,该文件是一个字典列表。

我的问题是某些字典缺少字段。如果缺少一个字段,我希望构造函数简单地接收 None 。但是由于现在编写代码,它会在异常时退出。

这是一个简单的情况说明

class Person()
    
    def __init__(self, id, age, name, gender):
        self.id = id
        self.age = age
        self.name = name
        self.gender = gender
        

people_list = pickle.load(open("some_file.p", "rb"))
first_person = people_list[0]  # this is a dictionary {'id': '1234', 'age': 27, 'name': 'robert'}
Person(first_person['id'], first_person['age'], first_person['name'], first_person['gender'])

由于现在编写代码,我得到一个'gender'不作为字典中的键存在的异常,这是真的。我希望任何缺失的字段都传递一个None值,但不做十亿iftry .. excepts。有没有好的方法来做到这一点?显然,仍然不会引发异常。

标签: python

解决方案


通常,您可以从dict具有默认值的 a 中获取一个值,如果它不存在:

d = {'a': 1}
print(d.get('b'))  # prints None

但在你的情况下,这会更合适:

class Person():
    # the defaults are defined in the constructor
    def __init__(self, id, age=None, name=None, gender=None):
        self.id = id
        self.age = age
        self.name = name
        self.gender = gender
        

people_list = pickle.load(open("some_file.p", "rb"))
for person in people_list:
    Person(**person)  # assuming they at least all have an 'id'

当然,这仅在字典的键与参数名称完全匹配时才有效。

运算符“**解包”字典,因此:

d = {'a': 1, 'b': 2}
f(**d)

是相同的:

f(a=1, b=2)

推荐阅读