2013-08-26 3 views
4

Если у меня есть сценарий вроде этого:Получение списка локально определенных функций в Python

import sys 

def square(x): 
    return x*x 

def cube(x): 
    return x**3 

Как я могу вернуть список всех функций, определенных локально в программе ['square', 'cube'], а не те, импортирован ,

Они включены, когда я пытаюсь использовать dir(), но все переменные и другие импортированные модули. Я не знаю, что положить в dir, чтобы обратиться к локально исполняемому файлу.

+0

попробовать 'местные жители()', но я не уверен, насколько полезным это будет – inspectorG4dget

ответ

5
l = [] 
for key, value in locals().items(): 
    if callable(value) and value.__module__ == __name__: 
     l.append(key) 
print l 

Так файл с содержанием:

from os.path import join 

def square(x): 
    return x*x 

def cube(x): 
    return x**3 

l = [] 
for key, value in locals().items(): 
    if callable(value) and value.__module__ == __name__: 
     l.append(key) 
print l 

Печать:

['square', 'cube'] 

Местные прицелы также работают:

def square(x): 
    return x*x 

def encapsulated(): 
    from os.path import join 

    def cube(x): 
     return x**3 

    l = [] 
    for key, value in locals().items(): 
     if callable(value) and value.__module__ == __name__: 
      l.append(key) 
    print l 

encapsulated() 

Печатает только:

['cube'] 
+2

Даже как one_liner: 'функции = [название (имя, вещь) в locals(). items() если вызываемый (вещь)) ' – 9000

+0

@ user2357112 Обновлен ответ. –

+0

Мне нравится это решение, потому что он не полагается на импорт других модулей, но когда я пытаюсь это сделать в своем реальном скрипте, он включает '' значение'' в качестве записи в 'l' по какой-то причине, что я не могу понять ... «Значение» не отображается в другом месте скрипта. – beroe

7

Применение inspect Модуль:

def is_function_local(object): 
    return isinstance(object, types.FunctionType) and object.__module__ == __name__ 

import sys 
print inspect.getmembers(sys.modules[__name__], predicate=is_function_local) 

Пример:

import inspect 
import types 
from os.path import join 

def square(x): 
    return x*x 

def cube(x): 
    return x**3 

def is_local(object): 
    return isinstance(object, types.FunctionType) and object.__module__ == __name__ 

import sys 
print [name for name, value in inspect.getmembers(sys.modules[__name__], predicate=is_local)] 

печатает:

['cube', 'is_local', 'square'] 

См: нет join функция импортируется из os.path.

is_local здесь, так как это функция - текущий модуль. Вы можете перенести его на другой модуль или исключить его вручную или определить вместо него lambda (как предлагал @BartoszKP).

+0

Дает [('куб', <куб функции в 0x0294AC70>), ('join', ), ('square', )], когда 'from os.path import join 'добавлен – BartoszKP

+0

@ user2357112 обновлен ответ – alecxe

+0

@Marcin: Этот пример только исключает импортированные функции, потому что встроенные функции не учитываются для' inspect.isfunction'. Но новая версия работает. – user2357112

1
import sys 
import inspect 
from os.path import join 

def square(x): 
    return x*x 

def cube(x): 
    return x**3 

print inspect.getmembers(sys.modules[__name__], \ 
     predicate = lambda f: inspect.isfunction(f) and f.__module__ == __name__) 

Печать:

[('cube', <function cube at 0x027BAC70>), ('square', <function square at 0x0272BAB0>)]