如何获取传递给 python 方法的参数字典?

问题描述 投票:0回答:1

对于简单的功能我们可以使用

def my_func(a, b):
    print(locals())

...如果使用

{a: 1, b: 2}
调用函数,将返回
my_func(a=1, b=2)

如果

my_function
是一个类方法,我怎么能得到相同的字典?*

python dictionary class local-variables
1个回答
1
投票

我们可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.