2017-09-16 195 views
1

好吧,我有兩個文件,filename1.pyfilename2.py,它們都有一個名稱相同的函數funB。第三個文件process.py具有從任一文件調用函數的功能。我似乎在努力調用正確的功能。從一個變量動態調用函數 - Python

process.py

from directoryA.filename1 import funB 
from directoryA.filename2 import funB 

def funA: 

    #do stuff to determine which filename and save it in variable named 'd' 
    d = 'filename2' 
    # here i want to call funB with *args based on what 'd' is 

這就是我一直eval()像這樣:

call_right_funB = eval(d.funB(*args))  

,但它似乎沒有工作。

任何幫助表示讚賞。

+0

在這種情況下,你不能只從'directoryA.filename1導入funB作爲f1'嗎?或者你真的需要動態查找模塊嗎? –

+0

@JonClements謝謝,是的,我需要動態查找模塊 – Darth

+0

他們不是「directory.filename」,而是「package.module」,或者我錯過了什麼? –

回答

3

問題是,您不能使用eval()以及字符串和類似方法的組合。什麼你寫的是:

call_right_funB = eval('filename'.funB(*args)) 

你可以做的是:

call_right_funB = eval(d + '.funB(*args)') 

但是,這不是很Python的方法。 我會建議創建一個詞典開關。即使你必須導入整個模塊:

import directoryA.filename1 
import directoryA.filename2 

dic_switch = {1: directoryA.filename1, 2: directoryA.filename2} 
switch_variable = 1 
call_right_funB = dic_switch[switch_variable].funB(*args) 

希望它有幫助。

+0

謝謝你,第一個「unpythonic」的方式工作正常。隨着詞典開關我怎麼會然後函數'funB' – Darth

+0

不客氣:-) 'call_right_funB = dict_switch [switch_variable] .funB(* args)'應該可以正常工作。 編輯: 如果你只使用它一次,你也可以這樣做: 'call_right_funB = {1:filename1,2:filename2} [switch_variable] .funB(* args)' – BluePat

+0

我得到AttributeError:'str'object has沒有屬性'funB' – Darth