0
所以,我試圖從一個特定的文件導入一個函數,並在一個不同的文件上的函數中運行它。這裏是我的代碼:如何導入一個你不知道python名字的函數?
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模塊和模式匹配得到所有蟒蛇文檔中「高清」之後出現的名字,只有返回的函數的名稱。 test_a_function導入python文檔,打開它,應用get_func_names,並嘗試使用eval函數計算函數名稱的第一個字符串,但是我收到一個錯誤,指出'str'對象不可調用。
有沒有辦法解決我的方法或其他方式來做到這一點?
編輯:
好的,謝謝你的回答,但最後因爲某些原因,它只能與導入庫模塊
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
咦?你爲什麼想要評估任何東西?只需將您的文件作爲模塊導入,並從您的字典中提取出想要的內容即可。看'__imp __()'。 –
Python也有一個強大的,可靠的AST模塊。您可以讓其解析器完成在另一個源文件中查找內容的工作。試圖使用正則表達式只是完全不必要的痛苦和痛苦(和錯誤,因爲你的正則表達式不知道'def foo'是否在多行字符串中)。 –
開始的地方:https://docs.python.org/2/library/imp.html; https://docs.python.org/2/library/ast.html –