简体   繁体   English

列出修饰方法的参数

[英]List arguments of decorated method

I want to list the arguments of my methods for a self documenting REST API. 我想列出用于自记录REST API的方法的参数。 I have found that I can get the arguments of a method using: 我发现可以使用以下方法获取方法的参数:

method.__code__.co_varnames[:method.__code__.co_argcount]

However, this does not work when the method is decorated. 但是,当装饰方法时,这不起作用。

class Rator:

    def __init__(self):
        pass

    def __call__(self, func):
        def wrapper(instance, **kwargs):
            func(instance, **kwargs)
        return wrapper


class Klass:

    def method(self, var_one=None, var_two=None):
        pass

    @Rator()
    def decorated_method(self, var_one=None, var_two=None):
        pass


if __name__ == '__main__':
    klass = Klass()
    print("method args is " + str(klass.method.__code__.co_varnames))
    print("decorated method args is " + str(klass.decorated_method.__code__.co_varnames))

Outputs 输出

method args is ('self', 'var_one', 'var_two')
decorated method args is ('instance',)

A solution that does not require change of the decorator is preferred. 不需要更改装饰器的解决方案是首选。

I know that this question is a duplicate of How to retrieve method arguments of a decorated python method , but it has since long been dead. 我知道这个问题是如何获取经过修饰的python方法的方法参数的重复,但是早就死了。

You need wrap you decorator with functools.wraps , then you can can inspect the methods via inspect.signature() : 您需要用functools.wraps包装装饰器,然后可以通过inspect.signature()检查方法:

import inspect
from functools import wraps


class Rator:
    def __init__(self):
        pass

    def __call__(self, func, **kwargs):
        @wraps(func)
        def wrapper(instance):
            func(instance, **kwargs)
        return wrapper


class Klass:
    def method(self, var_one=None, var_two=None):
        pass

    @Rator()
    def decorated_method(self, argument1, var_one=None, var_two=None):
        pass


if __name__ == '__main__':
    klass = Klass()
    print("method args is ", inspect.signature(klass.method))
    print("decorated method args is ", inspect.signature(klass.decorated_method))

Prints: 打印:

method args is  (var_one=None, var_two=None)
decorated method args is  (argument1, var_one=None, var_two=None)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM