Python: Как получить фактические параметры вызова функции в виде словаря? - PullRequest
1 голос
/ 01 мая 2020

В функции __init__ класса python я хочу сохранить все параметры, которые передаются в виде словаря для последующего восстановления объекта. Речь идет не о сигнатуре функции, которую я мог бы получить из модуля inspect, а о фактических параметрах и значениях, переданных с помощью недавнего вызова.

В настоящее время я пишу код, подобный этому:

def __init__(self, param1, param2, param3 = 12, **kwargs):
    self.init_dict = {
         'param1': param1,
         'param2': param2,
         'param3': param3,
    }
    self.init_dict.update(**kwargs)
    ...

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

Нет ли в python возможности просто получить все параметры как диктовку и сделать это как я с **kwargs?

Мое чувство кишки подсказывает мне, что это должно быть легко, однако я не нашел правильного модного слова для поиска в Google.

THX!

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Вы можете сделать это с помощью вызова locals():

class A:
    def __init__(self, a, b, *args, **kwargs):
        self.init_dict = locals()

a = A(1, 2, 'aa', foo='bar')
print(a.init_dict)

Выход:

{'self': <__main__.A at 0x7f3e5dd7fdf0>, 'a': 1, 'b': 2, 'args': ('aa',), 'kwargs': {'foo': 'bar'}}
0 голосов
/ 01 мая 2020

Если вы хотите, чтобы аргументы передавались в функцию __init__ без надоедливых переменных self и kwargs, вы можете просто удалить их.

И до тех пор, пока вызов locals является первой строкой __init__, он будет включать в себя только передаваемые ему параметры.

class student():
    def __init__(self, name, *args, **kwargs):
        self.init_dict = locals()
        self.init_dict = {x: self.init_dict[x] for x in self.init_dict if (x is not 'self') and (x is not 'kwargs')}

        random_number = 1234
        self.random_string = 'hello'


    def show_init_params(self):
        print(self.init_dict)

И если мы создадим например,

mike = student('mike', 'A', 'Biology', gpa=3.9)
mike.show_init_params()

Вывод должен быть

{'name': 'mike', 'args': ('A', 'Biology')}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...