Улучшение кода: проверить ключ в dict и сохранить в хранилище данных - PullRequest
0 голосов
/ 15 декабря 2009

Эй, я довольно новичок в 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 ]

2 голосов
/ 15 декабря 2009
def store_birthinfo(self, user, birthday):
  """
      Store birthinfo
  """

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

см. Документы по распаковке списков аргументов .

1 голос
/ 15 декабря 2009

Вы можете создать словарь по умолчанию, а затем обновить целевой словарь, как в

def store_birthinfo(self, user, birthday):
  """Store birthinfo"""
  birth_defaults = { 'name' : '',
                     'date' : '',
                     'place' : '',
                     'country' : ''}

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

Таким образом, у вас всегда будут установлены все параметры.

1 голос
/ 15 декабря 2009

Ответ ʞɔıu является самым коротким, хотя его семантика немного отличается от вашей, поскольку вы предоставите явный пустой строковый аргумент, если ключ отсутствует в словаре, а 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()
0 голосов
/ 15 декабря 2009

Опираясь на пост Питера Бенгтссона, вы также можете определить список соответствующих ключей и оставить данные пустыми {}, пока их не заполнит цикл.

def store_birthinfo(self, user, birthday):
    data = {}
    for key in 'date', 'place', 'country':
        data[key] = birthday.get(key, '')
    BirthInfo(user=user, **data).put()

Я полагаю, что это самый краткий и расширяемый способ указать, какие ключи использовать из дикта дня рождения. С немного большей детализацией, вы, вероятно, могли бы написать функцию для самоанализа BirthInfo для аргументов, которые она может принять.

0 голосов
/ 15 декабря 2009

Проблема может заключаться в том, что ваша переменная '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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...