2010-03-29 14 views
5

Chcę uzyskać nazwy słów kluczowych argumentów metod klasy. Chyba zrozumiał, jak uzyskać nazwy metod i sposobów, aby uzyskać zmienne nazwy konkretnej metody, ale nie rozumiem, jak połączyć te:Introspekcja w języku Python: jak uzyskać nazwy metod klas?

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 

będę musiał wystawiać nazwiska metody i ich argumenty do zewnętrznego API. Napisałem skręconą aplikację, aby połączyć się ze wspomnianym interfejsem API, a ta skręcona aplikacja będzie musiała opublikować te dane za pośrednictwem interfejsu API.

Tak, myślę, że będę używać coś takiego:

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

Raz, otoczenie uzyskać bardziej stabilne będę myśleć o lepszym rozwiązaniem.

+1

Dlaczego chcesz to zrobić? – ironfroggy

+0

python 2.5 nie lubi A .__ dict __ [nazwa_metody] .__ kod __. Co_varnames - obiekt "funkcja" nie ma atrybutu "__code__" Używanie inspekcji może być bardziej stabilne między wersjami python. –

Odpowiedz

5

Cóż, jako bezpośrednie przedłużenie, co zrobiłeś:

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

nadrukami:

self 
test1 

PS: Szczerze mówiąc, mam wrażenie, można to zrobić bardziej elegancko ..

Na przykład można zamienić a.__class__ na A, ale wiedział o tym ;-)

+0

Dzięki! Jeśli znasz lepsze rozwiązanie, nie ma za co. Mój poranny mózg rano to tylko trochę ... no wiesz ... ;-) – daccle

+1

Nie ma nic przydatnego w pokazywaniu ludziom, jak robić głupie rzeczy. – ironfroggy

+2

@ironfroggy dlaczego myślisz, że to jest głupie? – daccle

10
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 
+0

Widziałem wiele przykładów przy użyciu modułu inspect. Dlaczego warto sprawdzić dobry pomysł? Dlaczego nie używać klas do własnych metod? – daccle

+0

@daccle: Domyślam się, że 'inspect' był tam przed klasami pozwalającymi na takie poziomy introspekcji –

+1

sprawdzanie, czy api jest czyste. Używanie go sprawia, że ​​kod jest bardziej czytelny, jak sądzę. –

Powiązane problemy