如何导入一个你不知道python名称的函数?

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模块来只评估函数定义,但这将是相当多的工作(而编写的不希望这种行为发生的模块也不一定能正常工作)。