2012-02-03 23 views
5

Muszę dostosować __getattr__, aby wywołać inną funkcję do odczytu.dokumentacja dla __getattr__ zdefiniowanych atrybutów

Działa to dobrze, chyba że pomoc (object.attr) nie działa. Ten kod jest używany w środowisku interaktywnym, więc pomoc() staje się dla nas ważna.

Czy istnieje lepszy projekt do osiągnięcia tych samych funkcji, ale z help() działa dobrze.

Odpowiedz

1

Tekst używany do "pomocy" jest w rzeczywistości atrybutem "__doc__" obiektu. Chodzi o to, że w zależności od posiadanego obiektu, nie można po prostu ustawić na nim atrybutu __doc__.

Jeśli to, co potrzebne jest „help(object.attr)” do pracy (a nie help(object) pokazuje wszystkie możliwe atrybuty) jest to nieco łatwiejsze - powinieneś dostać tylko SHURE że cokolwiek __getattr__ powraca temat Hae prawidłowo ustawiony docstring.

ponieważ „to nie działa” Przypuszczam wracasz wewnętrzne Wyniki niektórych wywołania funkcji, jak w tym fragmencie:

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an integer 
     return foo() 
    ... 

Jeśli po prostu wróci funkcję „foo” się, bez wywoływania go, itrs docstring będzie wyświetlany normalnie.

Co można zrobić, jest owinięcie wartości zwracanej w __getattr__ jako obiekt dynamicznie utworzonej klasy wich zawiera prawidłowe docstring - tak, spróbuj użyć somethong tak:

def __getattr__(self, attr): 
    if attr == "foo": 
     #function "foo" returns an (whatever object) 
     result = foo() 
     res_type = type(result) 
     wrapper_dict = res_type.__dict__.copy() 
     wrapper_dict["__doc__"] = foo.__doc__ #(or "<desired documentation for this attribute>") 
     new_type = type(res_type.__name__, (res_type,), wrapper_dict) 
     # I will leave it as an "exercise for the reader" if the 
     # constructor of the returned object can't take an object 
     # of the same instance (python native data types, like int, float, list, can) 
     new_result = new_type(result) 
    elif ...: 
     ... 
    return new_result 

to powinno działać - chyba Mylę się z motywem, dlaczego Hel nie działa w pierwszej kolejności - jeśli tak jest, proszę podać przykład tego, co powracasz z __getattr__.

+0

Thannks, działa w moim przypadku. Wszystkie attr w __getattr__ zwraca rodzime typy danych python. –

1

Można przekształcić atrybut w właściwość. Właściwość automatycznie użyje metody doctring metody getter jako własnej. Alternatywnie możesz podać argument doc dla property().

+0

Inside __getattr__ to wywołanie funkcji używające attr jako parametru. Czy to możliwe z property()? To attr jest dynamiczne, nieznane przy tworzeniu obiektu. –

Powiązane problemy