如果我有这样的脚本:
import sys
def square(x):
return x*x
def cube(x):
return x**3
如何返回程序['square', 'cube']
中本地定义的所有函数的列表,而不是导入的函数。
当我尝试dir()
时,它们被包括在内,但所有变量和其他导入的模块也是如此。我不知道在dir
中放入什么来引用本地执行的文件。
答案 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>)]