Python 改进代码:测试dict中的键和数据存储中的存储
嘿,我对python还比较陌生,我有一段代码,它将出生信息存储到Google App Engine的数据存储中。代码可以工作,但它是正确的方法吗?是否有一种更简单的方法来执行此操作,即在将密钥存储在数据存储中之前确保密钥存在Python 改进代码:测试dict中的键和数据存储中的存储,python,google-app-engine,Python,Google App Engine,嘿,我对python还比较陌生,我有一段代码,它将出生信息存储到Google App Engine的数据存储中。代码可以工作,但它是正确的方法吗?是否有一种更简单的方法来执行此操作,即在将密钥存储在数据存储中之前确保密钥存在 def store_birthinfo(self, user, birthday): """ Store birthinfo """ name = '' date = '' place = '' country = '' for
def store_birthinfo(self, user, birthday):
"""
Store birthinfo
"""
name = ''
date = ''
place = ''
country = ''
for key in birthday.keys():
if key == 'name':
name = birthday['name']
elif key == 'date':
date = birthday['date']
elif key == 'place':
place = birthday['place']
elif key == 'country':
country = birthday['country']
birthinfo = BirthInfo(user = user,
date = date,
place = place,
country = country)
birthinfo.put()
请参阅上的文档
请参阅上的文档。ʞɔıu的答案是最短的,尽管它的语义与您的稍有不同,因为如果字典中缺少键,您的答案将提供一个显式的空字符串参数,而ʞɔu的答案将完全忽略关键字参数 为了完整性起见,有一种更简单的方法来完成您正在做的事情,而不必一直走到**:
def store_birthinfo(self, user, birthday):
"""
Store birthinfo
"""
birthinfo = BirthInfo(user = user,
date = birthday.get('date', ''),
place = birthday.get('place', ''),
country = birthday.get('country', ''))
birthinfo.put()
ʞɔıu的答案是最短的,尽管它的语义与您的稍有不同,因为如果字典中缺少关键字,您的答案将提供一个显式的空字符串参数,而ʞıu的答案将完全忽略关键字参数 为了完整性起见,有一种更简单的方法来完成您正在做的事情,而不必一直走到**:
def store_birthinfo(self, user, birthday):
"""
Store birthinfo
"""
birthinfo = BirthInfo(user = user,
date = birthday.get('date', ''),
place = birthday.get('place', ''),
country = birthday.get('country', ''))
birthinfo.put()
如果变量'birthday'包含类birthdinfo不期望的键,则可能会出现问题。一个更可靠的解决方案可能是这样的,它还可以让您清楚地了解空白值是否变为无或空字符串:
def store_birthinfo(self, user, birthday):
data = dict(name='', date='', place='', country='')
for key in [x for x in birthday.keys() if x in data]:
data[key] = birthday[key]
BirthInfo(user=user, **data).put()
如果变量'birthday'包含类birthdinfo不期望的键,则可能会出现问题。一个更可靠的解决方案可能是这样的,它还可以让您清楚地了解空白值是否变为无或空字符串:
def store_birthinfo(self, user, birthday):
data = dict(name='', date='', place='', country='')
for key in [x for x in birthday.keys() if x in data]:
data[key] = birthday[key]
BirthInfo(user=user, **data).put()
您可以创建默认词典,然后更新目标词典,如中所示
def store_birthinfo(self, user, birthday):
"""Store birthinfo"""
birth_defaults = { 'name' : '',
'date' : '',
'place' : '',
'country' : ''}
birth_defaults.update(birthday)
birthinfo = BirthInfo(**birth_defaults)
birthinfo.put()
这样,您将始终设置所有参数。您可以创建一个默认字典,然后更新目标字典,如中所示
def store_birthinfo(self, user, birthday):
"""Store birthinfo"""
birth_defaults = { 'name' : '',
'date' : '',
'place' : '',
'country' : ''}
birth_defaults.update(birthday)
birthinfo = BirthInfo(**birth_defaults)
birthinfo.put()
通过这种方式,您将始终设置所有参数。基于Peter Bengtsson的帖子,您还可以定义相关键的列表,并将数据保留为空
{}
,直到循环填充它
def store_birthinfo(self, user, birthday):
data = {}
for key in 'date', 'place', 'country':
data[key] = birthday.get(key, '')
BirthInfo(user=user, **data).put()
我相信这是最简洁和可扩展的方式来指定从生日口述中使用哪些键。更详细一点,您可能可以编写一个函数来内省
BirthInfo
,以获取它可以接受的参数。基于Peter Bengtsson的帖子,您还可以定义相关键的列表,并将数据保留为空{}
,直到循环填充它
def store_birthinfo(self, user, birthday):
data = {}
for key in 'date', 'place', 'country':
data[key] = birthday.get(key, '')
BirthInfo(user=user, **data).put()
我相信这是最简洁和可扩展的方式来指定从生日口述中使用哪些键。更详细一点,您可能可以编写一个函数来内省
BirthInfo
它可以接受的参数。谢谢。如果其中一个键不存在,它会将该键的值设置为空字符串还是无?它根本不会设置值,BirthInfo构造函数中将缺少关键字。我不确定这会有什么影响。它应该是该列的默认值,除非你给它一个不同的默认值,否则可能没有。如果birth
有一个额外的字段,这将导致TypeError
。只有当您担心生日
有额外字段时,这才是一个问题。谢谢。如果其中一个键不存在,它会将该键的值设置为空字符串还是无?它根本不会设置值,BirthInfo构造函数中将缺少关键字。我不确定这会有什么影响。它应该是该列的默认值,除非你给它一个不同的默认值,否则可能没有。如果birth
有一个额外的字段,这将导致TypeError
。这只是一个问题,如果你担心生日
有额外的字段。我更喜欢data.update(birth)
,因为它比loop.data.update更容易阅读,但效果却截然不同。它将在数据中不存在的地方添加新字段。这个循环将只分配给在数据中定义的键。我更喜欢data.update(birthday)
,因为它比loop.data.update更容易阅读,不过效果非常不同。它将在数据中不存在的地方添加新字段。此循环将仅分配给已在数据中定义的键。Re:most-terse,请尝试data={(键,生日。get(键,'))作为输入('date','place','country')}
grated。我应该考虑一下行李员Ted的睿智的话:“越少做声明性陈述,越不容易在回顾中显得愚蠢。”我认为您使用的是python 3中的字典生成器语法。但我认为这也有点不同。这将是{key:birthday.get(key“”)for key in('date','place','country')}您所做的将是一个集合生成器,创建一组元组。Re:最简洁的是,尝试data={(key,birthday.get(key“”)for key in('date','place','country')
。我应该考虑一下行李员Ted的睿智的话:“越少做声明性陈述,越不容易在回顾中显得愚蠢。”我认为您使用的是python 3中的字典生成器语法。但我认为这也有点不同。这将是{key:birthday.get(key',)for key in('date','place','country')}您所做的是一个集合生成器,创建一组元组。