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]
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.
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:
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']
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)
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.
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__])
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