Аргументы Python для ключевых слов распаковывают и возвращают словарь

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

Вручную я могу сделать:

def generate_student_dict(first_name=None, last_name=None , birthday=None, gender =None):
    return {
        'first_name': first_name,
        'last_name': last_name,
        'birthday': birthday,
        'gender': gender
    }

Но я не хочу этого делать. Есть ли способ, которым я могу сделать эту работу без фактического набора текста?

 def generate_student_dict(self, first_name=None, last_name=None, birthday=None, gender=None):
     return # Packed value from keyword argument.

4 ответа

Решение

Если этот способ подходит вам, используйте kwargs (см. Понимание kwargs в Python), как в фрагменте кода ниже:

def generate_student_dict(self, **kwargs):            
     return kwargs

В противном случае вы можете создать копию параметров с built-in locals() при запуске функции и вернуть эту копию:

def generate_student_dict(first_name=None, last_name=None , birthday=None, gender =None):
     # It's important to copy locals in first line of code (see @MuhammadTahir comment).
     args_passed = locals().copy()
     # some code
     return args_passed

generate_student_dict()

Если вы не хотите проходить **kwargs, вы можете просто вернуть locals:

def generate_student_dict(first_name=None, last_name=None, 
                          birthday=None, gender=None):
    return locals()

Обратите внимание, что вы хотите удалить self из результата, если вы передадите его в качестве аргумента.

Получить ключевые аргументы в **kwargs

def generate_student_dict(self, **kwargs):
  # use it like
  # kwargs.get('first_name')
  # kwargs.get('last_name')
  # kwargs.get('birthday')
  # kwargs.get('gender')
  return kwargs

Ты можешь использовать locals() функция. locals() обновляет и возвращает словарь, представляющий текущую локальную таблицу символов. Свободные переменные возвращаются locals() когда он вызывается в функциональных блоках, но не в блоках классов.

Если вы хотите вернуть обновленные значения в виде словаря

    def generate_student_dict(first_name=None, last_name=None , birthday=None, gender =None):
        main_args = locals().copy()
        first_name = 'first'
        last_name = 'last'
        birthday = '20 jan 1993'
        newvar = 100
        new_args = locals().copy()
        updated_args = {}

        for k,v in new_args.items():
            if k in main_args.keys():
                updated_args[k] = v
        return updated_args

    dict = generate_student_dict()
    print(dict) #{'first_name': 'first', 'last_name': 'last', 'birthday': '20 jan 1993', 'gender': None}

Если вы хотите вернуть исходные значения в виде словаря

    def generate_student_dict_1(first_name=None, last_name=None , birthday=None, gender =None):
        args = locals()
        first_name = 'first'
        last_name = 'last'
        birthday = '20 jan 1993'
        newvar = 100
        return args

    dict = generate_student_dict_1()
    print(dict) #{'first_name': None, 'last_name': None, 'birthday': None, 'gender': None}

если вы хотите включить все изменения, включая дополнительные переменные, определенные внутри метода

    def generate_student_dict_2(first_name=None, last_name=None , birthday=None, gender =None):
        first_name = 'first'
        last_name = 'last'
        birthday = '20 jan 1993'
        newvar = 100
        args = locals()
        return args

    dict = generate_student_dict_2()
    print(dict) #{'first_name': 'first', 'last_name': 'last', 'birthday': '20 jan 1993', 'gender': None, 'newvar': 100}
Другие вопросы по тегам