Python Introspection: Как получить имена классов методов? - PullRequest
5 голосов
/ 29 марта 2010

Я хочу получить имена ключевых аргументов методов класса. Я думаю, что понял, как получить имена методов и как получить имена переменных конкретного метода, но я не понимаю, как их объединить:

class A(object):
    def A1(self, test1=None):
        self.test1 = test1
    def A2(self, test2=None):
        self.test2 = test2
    def A3(self):
        pass
    def A4(self, test4=None, test5=None):
        self.test4 = test4
        self.test5 = test5

a = A()

# to get the names of the methods:

for methodname in a.__class__.__dict__.keys():
    print methodname

# to get the variable names of a specific method:

for varname in a.A1.__func__.__code__.co_varnames:
    print varname

# I want to have something like this:
for function in class:
    print function.name
    for varname in function:
        print varname

# desired output:
A1
self
test1
A2
self
test2
A3
self
A4
self
test4
test5

Мне нужно будет предоставить имена методов и их аргументы внешнему API. Я написал скрученное приложение для ссылки на упомянутый API, и это скрученное приложение должно будет опубликовать эти данные через API.

Итак, я думаю, что я буду использовать что-то вроде:

for methodname in A.__dict__.keys():
if not methodname.startswith('__'):
    print methodname
    for varname in A.__dict__[methodname].__code__.co_varnames:
        print varname

Как только обстановка станет более стабильной, я подумаю над лучшим решением.

Ответы [ 2 ]

10 голосов
/ 29 марта 2010
import inspect

for name, method in inspect.getmembers(a, inspect.ismethod):
    print name
    (args, varargs, varkw, defaults) = inspect.getargspec(method)
    for arg in args:
        print arg
5 голосов
/ 29 марта 2010

Ну, как прямое продолжение того, что вы сделали:

for varname in a.__class__.__dict__['A1'].__code__.co_varnames:
    print varname

печать:

self
test1

П.С .: Если честно, у меня такое чувство, что это можно сделать более элегантно ...

Например, вы можете заменить a.__class__ на A, но вы это знали ;-)

...