繁体   English   中英

如何用字典中的可选元素列表创建对象?

[英]How to create objects with a list of optional elements from a dictionary?

我一直在学习如何编程,这是我无法解决的问题:

我有一个类User,它带有4个参数,2个必需参数和2个可选参数:

class User:
    def __init__(self, user_id, first_name, last_name='', username=''):
        self.user_id = user_id
        self.first_name = first_name
        self.last_name = last_name
        self.username = username

然后我创建一个函数来创建这些对象,它们使用字典并使用键中的外观创建对象

users={}


def user_register(user_info):
if user_info['id'] in users:
    pass
else:
    print('cadastrando...')
    users[user_info['id']] = User(user_info['id'], user_info['first_name'],
                                  user_info['last_name'], user_info['username'])

example_userinfo1 = {'id':111, 'first_name':'john', 'last_name':'smith', 'username':'@johnsmith'}

example_userinfo2 = {'id':222, 'first_name':'bob'}

因此,仅当给定的字典具有所有四个键时才起作用,例如example_userinfo1,而example_userinfo2则不是(仅ID和first_name是必需的)。 我想知道在将密钥作为参数传递之前检查密钥是否存在的方法,我尝试了类似的尝试,但没有成功:

User(user_info['id'], user_info['first_name'],
        if 'last_name' in user_info: last_name=user_info['last_name'],
        if 'username' in user_info: username=user_info['username'])

那么解决这个问题的好方法是什么呢? 我也想知道我的代码中是否有许多不良做法的迹象(因为我试图开始注意那些事情)

使您的字典键与dir对应于参数名称,只需将整个字典用作关键字参数即可:

user_id = user_info.pop('id')
users[user_id]  = User(user_id, **user_info)

我用dict.pop()删除了'id'键,因为您的班级希望使用user_id 您已经为所有缺少的键提供了默认值。

否则,如果缺少键,则可以使用dict.get()返回空字符串:

User(user_info['id'], user_info['first_name'],
    last_name=user_info.get('last_name', ''),
    username=user_info.get('username', ''))

更好的方法是使用**解开dict 例如:

>>> userinfo = {'user_id':222, 'first_name':'bob'}
#                  ^  I am using `user_id` instead of `id`. 
#                     Continue reading for explanation
>>> User(**userinfo)
<__main__.User instance at 0x7f1f4c70cf80>

当您在函数调用中解开dict时,它会将dict键与函数参数映射,并将dict值映射为parameter的值。 因此,在这种情况下,您的函数调用就像:

User(user_id=222, first_name='bob')

编辑:基于用户的其他信息,因为从API返回id 由于id()是python中的内置函数,因此将id用作变量不是很好。 在这种情况下,您可以将dict明确修改为:

>>> userinfo = {'id':222, 'first_name':'bob'}
>>> userinfo['user_id'] = userinfo['id']
>>> del userinfo['id']
>>> userinfo
{'first_name': 'bob', 'user_id': 222}   # Final value hold by dict

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM