Функция, которая генерирует словарь с необязательными полями

#python #dictionary

#python #словарь

Вопрос:

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

У меня уже есть функция, но она выглядит непитонической и выглядит очень жестко запрограммированной.

 def build_entry(prefix=None,
                field_a=None,
                field_b=None,
                quantity_a=None,
                quantity_b=None,
                ):
    fields = {}
    if prefix is not None:
        fields['prefix'] = prefix
    if field_a is not None:
        fields['field_a'] = field_a
    if field_b is not None:
        fields['field_b'] = field_b
    if quantity_a is not None:
        fields['quantity_a'] = quantity_a
    if quantity_b is not None:
        fields['quantity_b'] = quantity_b

    return fields
  

Идея состоит в том, чтобы вызвать функцию следующим образом:

 fields = build_entry(*config) 


Input: [26, 0, None, None, 20]
Output: {'prefix': 26, 'field_a': 0, 'quantity_b': 5}

Input: [20, 5, None, None, None] 
Output: {'prefix': 20, 'field_a':5}

Input: [None, None, 0, 5, None]
Output: {'field_b': 0, 'quantity_a':5}
  

Есть идеи, как сделать эту функцию лучше или более pythonic? Или есть какая-либо функция, которая уже делает это?

Я использую Python 2.7.

Ответ №1:

 def build_entry(*values):
  keys = ['prefix', 'field_a', 'field_b', 'quantity_a', 'quantity_b']
  return { k: v for k, v in zip(keys, values) if v is not None}
  

А затем вызывается таким же образом:

 In [1]: build_entry(*[26, 0, None, None, 20])
Out[1]: {'prefix': 26, 'field_a': 0, 'quantity_b': 20}
  

Ответ №2:

Я думаю, что вы хотите что-то вроде этого:

 def build_entry(**kwargs):
  return kwargs

if __name__ == '__main__':
    print(build_entry(prefix=1, field_a='a'))
  

Выводит:

 {'prefix': 1, 'field_a': 'a'}