Можно ли перечислить все функции в модуле?
Я определил файл .py в этом формате:
foo.py
def foo1(): pass
def foo2(): pass
def foo3(): pass
Я импортирую его из другого файла:
main.py
from foo import *
# or
import foo
Возможно ли перечислить все имена функций, например. ["foo1", "foo2", "foo3"]
?
Спасибо за вашу помощь, я сделал класс для чего хочу, комментарий PLS, если у вас есть предложение
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]
Ответы
Ответ 1
Самый чистый способ сделать это - использовать модуль проверки. Он имеет функцию getmembers
, которая берет предикат в качестве второго аргумента. Вы можете использовать isfunction
как предикат.
import inspect
all_functions = inspect.getmembers(module, inspect.isfunction)
Теперь all_functions
будет списком кортежей, где первым элементом является имя функции, а второй элемент - сама функция.
Ответ 2
вы можете использовать dir для поиска пространства имен.
import foo
print dir(foo)
Пример: загрузка вашего foo в оболочке
>>> 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
>>>
Вы можете использовать getattr для получения связанного атрибута в foo и выяснить, является ли он вызываемым.
Проверьте документацию: http://docs.python.org/tutorial/modules.html#the-dir-function
и если вы это сделаете - "из импорта foo", имена будут включены в пространство имен, где вы это называете.
>>> from foo import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'atexit', 'foo1', 'foo2', 'foo3']
>>>
Следующее краткое изложение интроспекции на python может помочь вам:
Ответ 3
Попробуйте использовать модуль проверки, как показано ниже, для exmaple, если модуль → 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
Как
aaronasterling сказал, вы можете использовать getmembers функции из inspect
модуль для этого.
import inspect
name_func_tuples = inspect.getmembers(module, inspect.isfunction)
functions = dict(name_func_tuples)
Однако этот будет включать функции, которые были определены в другом месте, но импортированы в это пространство имен модулей.
Если вы хотите получить только те функции, которые были определены в этом модуле, используйте этот фрагмент:
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)
Ответ 5
Для дикого импорта
from foo import *
print dir()
вы можете использовать dir()
без параметра для отображения объектов в текущем пространстве имен модулей. Это, скорее всего, будет включать не только содержимое foo
.
В случае абсолютного импорта (который вы предпочитаете, кстати) вы можете передать модуль в dir()
:
import foo
print dir(foo)
Также проверьте документацию dir
. Поскольку вам нужны только функции, вы можете подумать об использовании inspect.isfunction
. Надеюсь, вы не используете этот список для целей, не требующих отладки.
Ответ 6
если вы хотите перечислить функции текущего модуля (т.е. не импортированные), вы также можете сделать что-то вроде этого:
import sys
def func1(): pass
def func2(): pass
if __name__ == '__main__':
print dir(sys.modules[__name__])