Есть ли способ получить число аргументов, которые принимает метод, если у нас просто есть имя метода в строковом типе? - PullRequest
3 голосов
/ 27 марта 2020

Прежде всего, я использую python 2.7.13, поэтому у меня очень ограниченные возможности. Я попытался:

@some_decorator
def xyz(self,a,b,c):
    pass
function_name = " xyz"    
inspect.getargspec(getattr(self,function_name))

и он дает:

ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)

Это дает 0 аргументов из-за декоратора. Если я попробую другие методы, он даст правильный список аргументов.

1 Ответ

0 голосов
/ 27 марта 2020

Одним из решений может быть использование модуля ast:

import ast    
def GetAllMethodsArgs(self):
    with open(os.path.abspath(__file__)) as file:
        node = ast.parse(file.read())

    classDefinitions = [n for n in node.body if isinstance(n, ast.ClassDef)]
    for classDef in classDefinitions:
        functions = [n for n in classDef.body if isinstance(n, ast.FunctionDef)]

    for function in functions:
        self.methodArgsdict[function.name] = len(function.args.args)

Вызвать это в инициализации класса после определения методаArgsdict = {}. Эта функция заполнит словарь с именем функции в качестве ключа и аргументами, которые он принимает в качестве значения.

...