Czy możliwe jest wyświetlenie wszystkich funkcji w module? [duplikat]

To pytanie ma już odpowiedź tutaj:

Zdefiniowałem plik. py w tym formacie:

Foo.py

def foo1(): pass
def foo2(): pass
def foo3(): pass

Importuję go z innego pliku:

Main.py

from foo import * 
# or
import foo

Czy jest możliwe wypisanie nazwy wszystkich funkcji, np. ["foo1", "foo2", "foo3"]?


Thanks for your pomocy, zrobiłem klasę do tego, co chcę, pls komentarz, jeśli masz sugestię

class GetFuncViaStr(object):
    def __init__(self):
        d = {}
        import foo
        for y in [getattr(foo, x) for x in dir(foo)]:
            if callable(y):
               d[y.__name__] = y
    def __getattr__(self, val) :
        if not val in self.d :
           raise NotImplementedError
        else:
           return d[val] 
Author: user478514, 2010-10-28

6 answers

Najczystszym sposobem na zrobienie tych rzeczy jest użycie modułu inspect. Posiada funkcję getmembers, która przyjmuje predykat jako drugi argument. Możesz użyć isfunction jako predykatu.

 import inspect

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

Teraz, {[3] } będzie lista krotek, gdzie pierwszy element to nazwa funkcji, a drugi element to sama funkcja.

 66
Author: aaronasterling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 07:30:51

Możesz użyć katalogu do eksploracji przestrzeni nazw.

import foo
print dir(foo)

Przykład: loading your foo in shell

>>> import foo
>>> dir(foo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo1', 'foo2', 'foo3']
>>> 
>>> getattr(foo, 'foo1')
<function foo1 at 0x100430410>
>>> k = getattr(foo, 'foo1')
>>> k.__name__
'foo1'
>>> callable(k)
True
>>> 

Możesz użyć getattr, aby uzyskać przypisany atrybut w foo i dowiedzieć się, czy można go wywołać.

Sprawdź dokumentację: http://docs.python.org/tutorial/modules.html#the-dir-function

A jeśli zrobisz - "from foo import *" to nazwy są zawarte w przestrzeni nazw, w której to wywołujesz.

>>> from foo import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'atexit', 'foo1', 'foo2', 'foo3']
>>> 

Następujący Krótki opis introspekcji w Pythonie może Ci pomóc:

 9
Author: pyfunc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 07:24:06

Spróbuj użyć modułu inspect jak poniżej dla modułu exmaple if --> temp.py

In [26]: import inspect

In [27]: import temp

In [28]: l1 = [x.__name__ for x in temp.__dict__.values() if inspect.isfunction(x)]

In [29]: print l1
['foo', 'coo']
 4
Author: shahjapan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 07:38:23

Jak aaronasterling powiedział , możesz użyć funkcji getmembers z modułu inspect, aby to zrobić.

import inspect

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

Jednakże ta będzie zawierać funkcje, które zostały zdefiniowane gdzie indziej , ale zaimportowane do przestrzeni nazw tego modułu.

Jeśli chcesz uzyskać tylko funkcje, które zostały zdefiniowane w tym module, użyj tego fragmentu:

name_func_tuples = inspect.getmembers(module, inspect.isfunction)
name_func_tuples = [t for t in name_func_tuples if inspect.getmodule(t[1]) == module]
functions = dict(name_func_tuples)
 3
Author: Flimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:28

Dla dzikiego importu

from foo import * 
print dir()

Możesz użyć dir() bez parametru do wyświetlania obiektów w bieżącej przestrzeni nazw modułu. Będzie to najprawdopodobniej więcej niż tylko treść foo.

W przypadku importu bezwzględnego (który powinieneś preferować przy okazji) możesz przekazać moduł do dir():

import foo
print dir(foo)

Sprawdź również dokumentację dir. Ponieważ chciałeś tylko funkcji, możesz pomyśleć o użyciu inspect.isfunction. Mam nadzieję, że nie używasz tej listy do celów niezwiązanych z debugowaniem.

 1
Author: AndiDog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 07:26:37

Jeśli chcesz wyświetlić listę funkcji bieżącego modułu (tzn. nie zaimportowanego), możesz również zrobić coś takiego:

import sys
def func1(): pass
def func2(): pass

if __name__ == '__main__':
    print dir(sys.modules[__name__])
 1
Author: verboze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-02 14:49:17