python - 将字典值传递给函数,缺少键
问题描述
我有一个带有接收多个参数的构造函数的类。我从一个外部文件中获得这些参数,该文件是一个字典列表。
我的问题是某些字典缺少字段。如果缺少一个字段,我希望构造函数简单地接收 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
值,但不做十亿if
或try .. except
s。有没有好的方法来做到这一点?显然,仍然不会引发异常。
解决方案
通常,您可以从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)
推荐阅读
- python - 如何在 Python 中每分钟更新一次变量?
- ruby-on-rails - Rails 避免了处理外部和内部数据的 N+1 查询问题
- mysql - MySQL代码中END关键字的语法错误问题
- java - 为什么在特定手机上不弹出运行时权限对话框?
- ios - 在 AWS Device Farm 上使用 Node.js webdriver.io 时的 AMDeviceSecureInstallApplication
- javascript - 显示时的 HTML 隐藏字段不发布值
- javascript - Popup.js 不适用于 Chrome 扩展
- c# - 初始化从单一行为派生的对象的最佳方法是什么?
- c++ - vscode windows:无法打开输出文件test.exe:权限被拒绝
- vue.js - 如何访问功能组件中的环境变量?