2008-09-26 16 views
250

Mam zainstalowany moduł Pythona w moim systemie i chciałbym móc zobaczyć, jakie funkcje/klas/metod są w nim dostępne.Jak wyświetlić listę wszystkich funkcji w module Pythona?

Chcę wywołać funkcję doc na każdym z nich. W ruby ​​mogę zrobić coś w stylu ClassName.methods, aby uzyskać listę wszystkich metod dostępnych na tej klasie. Czy jest coś podobnego w python?

np. coś w rodzaju:

from somemodule import foo 
print foo.methods # or whatever is the correct method to call 
+0

proszę rozważyć przejrzenie wybranej odpowiedzi! istnieją lepsze/łatwiejsze w użyciu rozwiązania sugerowane w innych odpowiedziach. – r2d2oid

Odpowiedz

90

Moduł inspekcyjny. Zobacz także moduł pydoc, funkcję help() w Interaktywnym tłumaczu oraz narzędzie wiersza poleceń, które generuje dokumentację, której szukasz. Możesz po prostu podać klasie, w której chcesz zobaczyć dokumentację. Mogą również generować na przykład dane wyjściowe HTML i zapisywać je na dysku.

+1

Zrobiłem przypadek użycia modułu 'ast' w pewnych sytuacjach w [moja odpowiedź] (http://stackoverflow.com/a/31005891/21028). – csl

+20

Nie rozumiem, dlaczego został wybrany jako odpowiedź, podczas gdy jest wyraźnie lepszy ... – frankliuao

331

Możesz użyć dir(module), aby zobaczyć wszystkie dostępne metody/atrybuty. Sprawdź także PyDocs.

+10

To nie jest ściśle zgodne z prawdą. Funkcja 'dir()' próbuje wytworzyć najbardziej odpowiednią, a nie pełną informację ". Źródło: http://docs.python.org/library/functions.html#dir. – Zearin

+14

@jAckOdE cytowane? Następnie uzyskasz dostępne metody i atrybuty modułu string. – OrangeTux

+0

@OrangeTux: oops, to powinno być pytanie. yeap, odpowiedziałeś. – jAckOdE

56
import types 
import yourmodule 

print [yourmodule.__dict__.get(a) for a in dir(yourmodule) 
    if isinstance(yourmodule.__dict__.get(a), types.FunctionType)] 
+7

Dla tej trasy użyj getattr (yourmodule, a, None) zamiast swojego modułu .__ dict __. Get (a) –

+0

Tylko pokazuje funkcje, a nie klasy, itp. –

+4

Twój_moduł .__ Dict__ to mój wybór, ponieważ faktycznie dostajesz dykta zawierającego functionName: i masz teraz możliwość ZADZWOŃANIA tej funkcji dynamicznie. dobre czasy! – jsh

108

Gdy masz import ed modułu, można po prostu zrobić:

help(modulename) 

... Aby uzyskać dokumenty dotyczące wszystkich funkcji na raz, interaktywnie. Możesz również użyć:

dir(modulename) 

... Aby wyświetlić listę wszystkich funkcji i zmiennych zdefiniowanych w module.

25

Ten rade:

dir(module) 

Jednakże, jeśli okaże się to irytujące czytać zwracanej listy, wystarczy kliknąć na poniższy pętlę, aby uzyskać jedną nazwę w wierszu.

for i in dir(module): print i 
53

przykład w przypadku sprawdzenia:

from inspect import getmembers, isfunction 
from my_project import my_module 

functions_list = [o for o in getmembers(my_module) if isfunction(o[1])] 

getmembers zwraca listę (object_name, typ_obiektu) krotki.

Funkcję isfunction można zastąpić dowolną inną funkcją isXX w module inspect.

+17

'getmembers' może przyjąć predykat, więc twój przykład może być również zapisany: ' functions_list = [o dla o w getmembers (my_module, isfunction)] ' –

+13

@ ChristopherCurrie, możesz także uniknąć bezużytecznego rozumienia list z' functions_list = getmembers (mój_moduł, predykat) ', ponieważ już zwraca listę;) – Nil

+0

Aby znaleźć czy funkcja jest zdefiniowana w tym module (zamiast importowana) add: to "if isfunction (o [1]) ** i o [1] .__ module__ == my_module .__ name __ **" - zauważ, że nie będzie działać koniecznie, jeśli importowane functi on pochodzi z modułu o tej samej nazwie co ten moduł. –

17

dir(module) to standardowy sposób korzystania ze skryptu lub standardowego interpretera, jak wspomniano w większości odpowiedzi.

Jednak w przypadku interaktywnej powłoki Pythona, takiej jak IPython, można użyć funkcji uzupełniania kart, aby uzyskać przegląd wszystkich obiektów zdefiniowanych w module. Jest to o wiele wygodniejsze, niż używanie skryptu i print, aby zobaczyć, 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 klasy
  • module.function_xy? lub module.ClassX.method_xy? pokaże docstring z funkcja/metoda
  • module.function_x?? lub module.SomeClass.method_xy?? pokaże ci kod źródłowy funkcji/metody.
-5

To nie jest (lub przynajmniej nie jest) właściwe używanie katalogu (moduł). Kod powinien brzmieć tak:

dir('module') or dir('modules') 

Albo podać moduł, który ma tak: dir('sys') produkować wyniki sys nazwa modułu. dir() zwraca błędy, podczas gdy dir('') jest to, czego potrzebujesz. * help ('') zwróci informacje pomocy, jeśli są dostępne dla większości funkcji. na przykład; help('modules') zwróci informacje pomocy modułu.

Dzięki za wszystkie głosy w dół. Użyłem Python3.2.2 i innych wersji 3x, kiedy to opublikowałem. Chodzi o to, aby użyć ("stuff") zamiast poprzedniego (stuff). Ale zakładam, że wszyscy utknęliście na Pythonie2 lub używali nowszych wersji na PC, nie tak jak ja.

http://effbot.org/librarybook/sys.htm

+0

lub możesz określić moduł, który chcesz: dir ("sys"), aby uzyskać wyniki z nazwy modułu sys. dir() zwraca błędy, podczas gdy katalog ('') jest tym, czego potrzebujesz. * help ('') zwróci informacje pomocy, jeśli są dostępne dla większości funkcji.na przykład; help ("moduły") zwróci informacje o pomocy modułu. –

+5

dir ('module') zwraca metody dla funkcji string, która jest całkowicie odmienna od oczekiwanej. Wierzę, że to samo dotyczy python 3. –

1

Żadna z tych odpowiedzi będzie działać, jeśli nie jesteś w stanie import wspomnianego pliku Python bez błędów importu. Tak było w przypadku, gdy sprawdzałem plik, który pochodzi z dużej bazy kodu z wieloma zależnościami. Następujący przetworzy plik jako tekst i wyszuka wszystkie nazwy metod rozpoczynające się od "def" i wypisze je oraz ich numery linii.

import re 
pattern = re.compile("def (.*)\(") 
for i, line in enumerate(open('Example.py')): 
    for match in re.finditer(pattern, line): 
    print '%s: %s' % (i+1, match.groups()[0]) 
+1

W tym przypadku znacznie lepiej jest użyć modułu 'ast'. Zobacz [moja odpowiedź] (http://stackoverflow.com/a/31005891/21028) na przykład. – csl

+0

Myślę, że to jest poprawna metoda. Po co to robić? – erm3nda

21

kompletności boską, chciałbym podkreślić, że czasami może chcesz kodu parse zamiast importować je. Wyrażenia najwyższego poziomu mogą być wykonywane przy użyciu import i może to stanowić problem.

Na przykład, pozwalam użytkownikom wybierać funkcje punktu wejścia dla pakietów tworzonych przy użyciu zipapp. Korzystanie z ryzykownego kodu, prowadzącego do awarii, pomoc w drukowaniu komunikatów, pojawianie się okien dialogowych GUI i tak dalej.

Zamiast korzystać z modułu ast do listy wszystkich funkcji najwyższego poziomu:

import ast 
import sys 

def top_level_functions(body): 
    return (f for f in body if isinstance(f, ast.FunctionDef)) 

def parse_ast(filename): 
    with open(filename, "rt") as file: 
     return ast.parse(file.read(), filename=filename) 

if __name__ == "__main__": 
    for filename in sys.argv[1:]: 
     print(filename) 
     tree = parse_ast(filename) 
     for func in top_level_functions(tree.body): 
      print(" %s" % func.name) 

Umieszczenie tego kodu w list.py i stosując się jako dane wejściowe, otrzymuję:

$ python list.py list.py 
list.py 
    top_level_functions 
    parse_ast 

Oczywiście, nawigacja w AST może być czasem trudna, nawet w przypadku stosunkowo prostego języka, takiego jak Python, ponieważ 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.

+1

Podoba mi się to; Obecnie próbuję dowiedzieć się, czy ktoś już napisał narzędzie, które robi coś podobnego do pydoc, ale bez importowania modułu. Jak dotąd jest to najlepszy przykład, jaki udało mi się znaleźć :) –

+1

Jest to zdecydowanie najlepsza droga do tego, o wiele bezpieczniejsza! Dzięki! – David

-5

można użyć następującej metody do listy uzyskać wszystkie funkcje w module od powłoki:

import module

module.*? 
0

wyjątkiem dir (moduł) lub pomoc (moduł) wspomniano w poprzednich odpowiedziach, ty można również wypróbować:
- Otwórz ipython
- import nazwa_modułu
- wpisz nazwę modułu, naciśnij zakładkę. Otworzy małe okno z listą wszystkich funkcji w module Pythona.
Wygląda bardzo schludnie.

Oto snippet wymieniając wszystkie funkcje modułu hashlib

(C:\Program Files\Anaconda2) C:\Users\lenovo>ipython 
Python 2.7.12 |Anaconda 4.2.0 (64-bit)| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)] 
Type "copyright", "credits" or "license" for more information. 

IPython 5.1.0 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: import hashlib 

In [2]: hashlib. 
      hashlib.algorithms   hashlib.new     hashlib.sha256 
      hashlib.algorithms_available hashlib.pbkdf2_hmac   hashlib.sha384 
      hashlib.algorithms_guaranteed hashlib.sha1     hashlib.sha512 
      hashlib.md5     hashlib.sha224 
1

Dla kodu, które nie chcą, aby analizować, polecam AST podejście oparte o @csl powyżej.

Do wszystkiego innego, moduł wglądu jest poprawna:

import inspect 

import <module_to_inspect> as module 

functions = inspect.getmembers(module, inspect.isfunction) 

Daje listę 2-krotek w formie [(<name:str>, <value:function>), ...].

Powyższa prosta odpowiedź znajduje się w różnych odpowiedziach i komentarzach, ale nie została wyraźnie wywołana.

Powiązane problemy