Python:如何获得函数调用的实际参数作为字典



在python类的__init__函数中,我想将所有传入的参数存储为字典,以便以后恢复对象。这与函数签名无关,就像我可以从检查模块中获得它一样,而是与最近调用中传入的实际参数和值有关。

目前,我写的代码是这样的:

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中,不是有可能只将所有参数作为dict获取,并像我使用**kwargs那样执行吗?

我的直觉告诉我,这应该很容易,然而,我没有找到正确的谷歌流行语。

THX!

您可以使用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'}}

如果您希望传递给__init__函数的参数不包含讨厌的selfkwargs变量,那么您可以简单地删除它们。

只要对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')}

最新更新