How to import a function that you do not know the names of in python?
所以,我尝试从一个特定的文件导入一个函数,并在另一个文件的函数中运行它。这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import re def get_func_names(string): temp = re.compile(r"def [a-z]+") result = temp.findall(string) return [elem[4:] for elem in result] def test_a_function(val): import swift g = open('swift.py', 'r') g = g.read() functions = get_func_names(g) k = functions[0] k = eval(k(val)) return k |
get-func-names使用re-module和pattern匹配来获取在python文档中"def"后面出现的所有名称,并且只返回函数的名称。test_a_函数导入python文档,打开它,应用get_func_名称,并尝试使用eval函数计算函数名的第一个字符串,但我得到一个错误,说明"str"对象不可调用。
有没有一种方法可以修复我的方法或者其他的方法?
编辑:
好的,谢谢您的回答,但最终由于某种原因,它只能与importlib模块一起使用。
1 2 3 4 5 6 7 8 9 10 | import importlib import types def getfuncs(modulename): retval = {} opened = importlib.import_module(modulename) for name in opened.__dict__.keys(): if isinstance(opened.__dict__[name], types.FunctionType): retval[name] = opened.__dict__[name] return retval |
考虑:
1 2 3 4 5 6 7 8 9 10 11 | import types def getfuncs(modulename): retval = {} module = __import__(modulename, globals(), locals(), [], -1) for (name, item) in module.__dict__.iteritems(): if isinstance(item, types.FunctionType): retval[name] = item return retval getfuncs('swift') # returns a dictionary of functions in the swift module |
如果您不希望在模块级别上进行评估产生副作用,那么可以使用AST模块来只评估函数定义,但这将是相当多的工作(而编写的不希望这种行为发生的模块也不一定能正常工作)。