对于简单的功能我们可以使用
def my_func(a, b):
print(locals())
...如果使用
{a: 1, b: 2}
调用函数,将返回 my_func(a=1, b=2)
。
如果
my_function
是一个类方法,我怎么能得到相同的字典?*
我们可以使用
co_varnames
和__defaults__
:
class Foo:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def some_method(self, a=0, b=1):
return a + b
print(Foo.some_method.__code__.co_varnames)
print(Foo.some_method.__defaults__)
print({f'{key}: {value}' for key, value in zip(Foo.some_method.__code__.co_varnames[1:], Foo.some_method.__defaults__)})
输出:
('self', 'a', 'b')
(0, 1)
{'a: 0', 'b: 1'}
如果
some_method
是classmethod
我们可以做同样的事情:
class Foo:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
@classmethod
def some_method(cls, a=0, b=1):
return a + b
print(Foo.some_method.__code__.co_varnames)
print(Foo.some_method.__defaults__)
print({f'{key}: {value}' for key, value in zip(Foo.some_method.__code__.co_varnames[1:], Foo.some_method.__defaults__)})
我们也可以使用
Foo
的instance
:
instance = Foo()
print(instance.some_method.__code__.co_varnames)
print(instance.some_method.__defaults__)
print({f'{key}: {value}' for key, value in zip(instance.some_method.__code__.co_varnames[1:], instance.some_method.__defaults__)})
但这是假设参数被输入到
def
initiation:
def some_method(self, a=0, b=1):
...
否则,如果
some_method
的参数没有 __default__
值:
def some_method(self, a, b):
...
然后
print(Foo.some_method.__defaults__)
和print(instance.some_method.__defaults__)
输出:
None