有時候咱們想經過字符串調用已經定義好的函數,一開始的思路及實現方式以下:ide
def chinese(text): print('jieba分詞') def english(text): print('nltk處理對文本進行分詞') def textprocess(file, language): text = open(file).read() #字符串調用chinese()或english()函數。 language(text) #調用函數 file = 'data.txt' language = 'english' textprocess(file, language)
可是函數
textprocess(file='data.txt', language='english') language(text) TypeError: 'str' object is not callable
百度谷歌一番,我查到如下幾種方式翻譯
1-字典
最簡單,易上手的方式,使用字典配對。code
def chinese(text): print('jieba分詞') def english(text): print('nltk處理對文本進行分詞') str_func_pair = {'chinese': chinese, 'english': english} def textprocess(file, language): text = open(file).read() #字典調用出函數名 str_func_pair[language](text) file = 'data.txt' language = 'english' textprocess(file, language)
2- globals()
使用globals()函數獲取全局變量,其實實現方式跟字典差很少。咱們先看看代碼當前的變量們有哪些對象
def chinese(text): print('jieba分詞') def english(text): print('nltk處理對文本進行分詞') #查看全局變量 print(globals())
咱們發現這不就是字典嗎?字符串
{'__name__': '__main__', '__doc__': None, 此處省略一部分變量,方便展現 'chinese': <function chinese at 0x101f62e18>, 'english': <function english at 0x10453ca60>}
因而it
def chinese(text): print('jieba分詞') def english(text): print('nltk處理對文本進行分詞') def textprocess(file, language): text = open(file).read() #globals()調用出函數名 globals()[language](text) file = 'data.txt' language = 'english' textprocess(file, language)
3-eval()
eval英文名翻譯過來大概是等同的意思。io
data = "[1,2,3,4]" print(type(data)) print(type(eval(data)))
咱們發現,eval能夠將字符串轉化爲咱們想要的列表對象。function
<class 'str'> <class 'list'>
據此,咱們用eval也能夠用字符串調用函數class
def chinese(text): print('jieba分詞') def english(text): print('nltk處理對文本進行分詞') def textprocess(file, language): text = open(file).read() eval(language)(text) file = 'data.txt' language = 'english' textprocess(file, language)