改进代码:测试dict中的密钥并存储在数据存储区中

时间:2009-12-15 15:12:42

标签: python google-app-engine

嘿,我是python的新手我有这段代码将出生信息存储到Google App Engine中的数据存储区。代码有效,但这是正确的方法吗?有没有更简单的方法来确保密钥在存储到数据存储区之前存在?

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()

5 个答案:

答案 0 :(得分:2)

def store_birthinfo(self, user, birthday):
  """
      Store birthinfo
  """

  birthinfo = BirthInfo(user=user, **birthday)
  birthinfo.put()

查看unpacking argument lists上的文档。

答案 1 :(得分:1)

ʞɔı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()

答案 2 :(得分:1)

您可以创建默认字典,然后按

更新目标字典
def store_birthinfo(self, user, birthday):
  """Store birthinfo"""
  birth_defaults = { 'name' : '',
                     'date' : '',
                     'place' : '',
                     'country' : ''}

  birth_defaults.update(birthday)
  birthinfo = BirthInfo(**birth_defaults)
  birthinfo.put()

通过这种方式,您将始终设置所有参数。

答案 3 :(得分:0)

问题可能是您的变量'birthday'包含BirthInfo类不期望的键。一个更可靠的解决方案可能是这个,它还可以让您清楚地了解空白变为无或空字符串:

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()

答案 4 :(得分:0)

在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它可以接受的参数。