Mam moduł Pythona zainstalowany w moim systemie i chciałbym móc zobaczyć, jakie funkcje / klasy / metody są w nim dostępne.
Chcę wywołać funkcję doc na każdym z nich. W Ruby mogę zrobić coś takiego jak ClassName.methods, aby uzyskać listę wszystkich metod dostępnych w tej klasie. Czy w Pythonie jest coś podobnego?
na przykład. coś jak:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
python
reflection
module
inspect
Chris Gow
źródło
źródło
Odpowiedzi:
inspect
Moduł. Zobacz takżepydoc
moduł,help()
funkcję interaktywnego interpretera ipydoc
narzędzie wiersza poleceń, które generuje poszukiwaną dokumentację. Możesz po prostu dać im klasę, której dokumentację chcesz zobaczyć. Mogą również generować na przykład dane wyjściowe HTML i zapisywać je na dysku.źródło
ast
W mojej odpowiedzi uzasadniłem użycie modułu w określonych sytuacjach .dir
do zwracania funkcji i zmiennych; służyinspect
do filtrowania tylko funkcji; i użyjast
do parsowania bez importowania.Możesz użyć,
dir(module)
aby zobaczyć wszystkie dostępne metody / atrybuty. Sprawdź także PyDocs.źródło
dir()
funkcji „próby wytworzenia najbardziej istotne, niż kompletną informację”. Źródło: docs.python.org/library/functions.html#dir .inspect
.Po
import
edycji modułu możesz po prostu:... Aby uzyskać dokumenty dotyczące wszystkich funkcji jednocześnie, interaktywnie. Lub możesz użyć:
... Aby po prostu wymienić nazwy wszystkich funkcji i zmiennych zdefiniowanych w module.
źródło
inspect
moduł może również wyświetlać zmienne, nawet jeśli nie jest to wyraźnie wymagane. To rozwiązanie wymaga tylko wbudowanych obiektów, co może być bardzo przydatne w niektórych przypadkach, w których Python jest zainstalowany w środowisku ograniczonym / zablokowanym / uszkodzonym.dir
że wydrukuje wyniki, ale wygląda na to, że musisz to zrobićprint(dir(modulename))
.Przykład z inspekcją:
getmembers zwraca listę krotek (nazwa_obiektu, typ_obiektu).
Możesz zastąpić isfunkcję dowolną inną funkcją isXXX w module inspekcji.
źródło
getmembers
może przyjąć predykat, aby można było napisać przykład:functions_list = [o for o in getmembers(my_module, isfunction)]
functions_list = getmembers(my_module, predicate)
ponieważ zwraca ona już listę;)źródło
Dla kompletności chciałbym zauważyć, że czasami możesz chcieć przeanalizować kod zamiast go importować.
import
Będzie wykonać wyrażenia najwyższego poziomu, a to może być problem.Na przykład pozwalam użytkownikom wybrać funkcje punktu wejścia dla pakietów tworzonych za pomocą zipappa . Używanie
import
iinspect
ryzyko uruchomienia błędnego kodu, co prowadzi do awarii, pomaga drukować komunikaty, wyświetla się okna dialogowe GUI i tak dalej.Zamiast tego używam modułu ast , aby wyświetlić listę wszystkich funkcji najwyższego poziomu:
Umieszczając ten kod
list.py
i wykorzystując go jako dane wejściowe, otrzymuję:Oczywiście nawigacja w AST może być czasem trudna, nawet w przypadku stosunkowo prostego języka, takiego jak Python, ponieważ poziom AST jest dość niski. Ale jeśli masz prosty i przejrzysty przypadek użycia, jest to wykonalne i bezpieczne.
Jednak wadą jest to, że nie można wykryć funkcji generowanych w czasie wykonywania, takich jak
foo = lambda x,y: x*y
.źródło
__version__
itp.). Czy istnieje sposób na uzyskanie tego?W przypadku kodu, którego nie chcesz analizować, zalecam podejście oparte na AST @csl powyżej.
W pozostałych przypadkach moduł sprawdzania jest poprawny:
Daje to listę 2-krotek w formularzu
[(<name:str>, <value:function>), ...]
.Prosta odpowiedź powyżej jest podana w różnych odpowiedziach i komentarzach, ale nie jest wyraźnie wzywana.
źródło
To załatwi sprawę:
Jeśli jednak irytujesz czytanie przeczytanej listy, po prostu użyj następującej pętli, aby uzyskać jedną nazwę w wierszu.
źródło
inspect
. Poza tym, czym różni się to od odpowiedzi @ DanLenski?dir(module)
jest standardowym sposobem korzystania ze skryptu lub standardowego interpretera, jak wspomniano w większości odpowiedzi.Jednak dzięki interaktywnej powłoce pythonowej, takiej jak IPython , można użyć tabulacji, aby uzyskać przegląd wszystkich obiektów zdefiniowanych w module. Jest to o wiele wygodniejsze niż używanie skryptu i
print
sprawdzanie, co jest zdefiniowane w module.module.<tab>
pokaże wszystkie obiekty zdefiniowane w module (funkcje, klasy i tak dalej)module.ClassX.<tab>
pokaże metody i atrybuty klasymodule.function_xy?
lubmodule.ClassX.method_xy?
pokaże ci dokumentację tej funkcji / metodymodule.function_x??
lubmodule.SomeClass.method_xy??
pokaże kod źródłowy funkcji / metody.źródło
W przypadku funkcji globalnych
dir()
należy użyć polecenia (jak wspomniano w większości tych odpowiedzi), jednak zawiera ono zarówno funkcje publiczne, jak i funkcje niepubliczne.Na przykład bieganie:
Zwraca funkcje / klasy, takie jak:
Niektóre z nich zasadniczo nie są przeznaczone do ogólnego użytku w programowaniu (ale przez sam moduł, z wyjątkiem DunderAliases, takich jak
__doc__
,__file__
ect). Z tego powodu może być nieprzydatne, aby wymienić je na publiczne (w ten sposób Python wie, co uzyskać, używającfrom module import *
).__all__
może być użyty do rozwiązania tego problemu, zwraca listę wszystkich funkcji publicznych i klas w module (tych, które nie zaczynają się od podkreślenia -_
). Zobacz Czy ktoś może wyjaśnić __all__ w Pythonie? do użytku__all__
.Oto przykład:
Wszystkie funkcje i klasy ze znakami podkreślenia zostały usunięte, pozostawiając tylko te, które są zdefiniowane jako publiczne i dlatego mogą być używane przez
import *
.Pamiętaj, że
__all__
nie zawsze jest zdefiniowane. Jeśli nie jest uwzględniony, toAttributeError
jest podnoszony.Przykładem może być moduł ast:
źródło
Żadna z tych odpowiedzi nie zadziała, jeśli nie będzie można zaimportować wspomnianego pliku Python bez błędów importu. Tak było w przypadku, gdy sprawdzałem plik pochodzący z dużej bazy kodu z wieloma zależnościami. Poniżej przetworzy plik jako tekst i wyszuka wszystkie nazwy metod zaczynające się od „def” i wydrukuje je wraz z numerami wierszy.
źródło
ast
modułu. Zobacz moją odpowiedź na przykład.Poza katalogiem (moduł) lub pomocą (moduł) wspomnianym w poprzednich odpowiedziach możesz także spróbować:
- Otwórz ipython
- import nazwa_modułu
- wpisz nazwa_modułu, naciśnij klawisz tab. Otworzy małe okno z listą wszystkich funkcji w module python.
Wygląda bardzo schludnie.
Oto fragment listy wszystkich funkcji modułu hashlib
źródło
Spowoduje to dodanie do listy wszystkich funkcji zdefiniowanych w module_urządzenia.
źródło
unit8_conversion_methods
jest Czy to tylko przykład nazwy modułu?[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
Możesz użyć następującej metody, aby uzyskać listę wszystkich funkcji w module z powłoki:
import module
źródło
źródło
Wynik :
źródło