Аргументы ключевого слова 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.

person Karan Kumar    schedule 04.02.2016    source источник
comment
почему ты хочешь сделать это?   -  person Padraic Cunningham    schedule 04.02.2016
comment
Первоначально я хотел передать этот возврат в метод создания модели Django. @ПадраикКаннингэм   -  person Karan Kumar    schedule 05.02.2016


Ответы (5)


Если вам подходит этот способ, используйте 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()
person Andriy Ivaneyko    schedule 04.02.2016
comment
locals() будет работать только в том случае, если в теле метода не определена переменная :) - person Muhammad Tahir; 04.02.2016
comment
@MuhammadTahir Спасибо за исправление, я обновил ответ. - person Andriy Ivaneyko; 04.02.2016

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

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

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

person Maroun    schedule 04.02.2016

Получить аргументы ключевого слова в **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
person Muhammad Tahir    schedule 04.02.2016

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

person user2719152    schedule 04.02.2016

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

    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}
person niranjan patidar    schedule 11.02.2020