Подтвердить что ты не робот

Можно ли перечислить все функции в модуле?

Я определил файл .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] 
4b9b3361

Ответ 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__])