获取python中本地定义函数的列表

时间:2013-08-26 19:25:59

标签: python function

如果我有这样的脚本:

import sys

def square(x):
    return x*x

def cube(x):
    return x**3

如何返回程序['square', 'cube']中本地定义的所有函数的列表,而不是导入的函数。

当我尝试dir()时,它们被包括在内,但所有变量和其他导入的模块也是如此。我不知道在dir中放入什么来引用本地执行的文件。

3 个答案:

答案 0 :(得分:10)

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']

答案 1 :(得分: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)。

答案 2 :(得分: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>)]