2017-04-21 75 views
-1

是的,我的這個Change conditions using loop and array in python類型錯誤:「海峽」對象不是可調用的Python腳本

所以一個作家,我想從這個更改條件:

if sys.argv[1] == 'add': 
    sys.exit(add(db, usr)) 
if sys.argv[1] == 'rem': 
    sys.exit(rem(db, usr)) 
if sys.argv[1] == 'rmusr': 
    sys.exit(rmusr(db, usr)) 

我想改變這些條件在列表與循環

從其他開發商的答案,我用這個:

actions = ['add','rem','rmusr'] 
if sys.argv[1] in actions: 
    sys.exit(sys.argv[1](db, usr)) 

但是,當我試圖檢查它的功能,我有這個

File "sql.py", line 25, in <module> 
    sys.exit(sys.argv[1](db, usr)) 
TypeError: 'str' object is not callable 

我不明白,我哪裏有錯誤?

+1

他們在鏈接的問題中使用了字典,您使用的是列表 –

+0

,因爲我認爲該列表應該可以工作,但我不明白,爲什麼它不起作用 – Piduna

+0

您有一個不是字符串的列表函數列表 –

回答

0

爲了調用由sys.argv[1]命名的函數,需要首先獲取該函數。例如:

def add(x,y): 
    return x + y 

def mul(x,y): 
    return x * y 

def perform(action, x, y): 
    # action is a string containing a function name ("add" or "mul"). 
    # globals() contains the accessible members, along with the functions. 
    return globals()[action](x, y) 

在原代碼方面:

actions = ['add','rem','rmusr'] 
if sys.argv[1] in actions: 
    func = globals()[sys.argv[1]] 
    sys.exit(func(db, usr)) 
1

你的錯誤特別是因爲你試圖調用帶有簽名字符串的方法(DB,USR)。行sys.argv [1]指的是字符串位於您的程序 sys中的列表 argv。字符串不可調用;你的代碼是等價的:

"add"(db, usr) # add is not a variable name. 

回答其他問題使用的字典,字典的查詢密鑰用相同名稱的具體方法有關,所以他們沒有叫串竟有如此查找從字典中使用字符串的方法。

0

你可以使用這樣的事情:

# specify the function to call for each command: 
# (note: the lookup key is a string, but the value is a function reference) 
actions = {'add': add, 'rem': rem, 'rmusr': rmusr} 
cmd = sys.argv[1] 
# check if it's in the dictionary's keys 
if cmd in actions: 
    # lookup the function to call 
    func = actions[cmd] 
    # call the function 
    sys.exit(func(db, usr)) 

或者,這是更簡潔,也不太具體。它使用這樣一個事實,即所有已定義的函數都按名稱列在globals()字典中。

# list of all allowed commands: 
actions = ['add', 'rem', 'rmusr'] 
cmd = sys.argv[1] 
# check if it's allowed 
if cmd in actions: 
    # lookup the function by name in the globals() dictionary 
    func = globals()[cmd] 
    # call the function 
    sys.exit(func(db, usr)) 
0

sys.argv[1]str類型(字符串)的,和一個字符串是的功能。所以當你試圖執行sys.argv[1](db, usr)時,你實際上試圖執行一個字符串,就好像它是一個函數一樣,這是不允許的。

可以做什麼,但是,通過使用sys.argv[1]裏面的值來查找功能。你可以用多種方式做到這一點。一種方法是使用globals()來查找函數,該函數返回映射到實際函數本身的函數名字典。

例如:

比方說,你用這個命令執行程序:python myScript.py argument1。這意味着sys.argv[1]將具有值"argument1"。然後你會採取這一價值和查找由globals()返回的字典功能(或者你可以使用locals()如果你在相同的範圍內,你調用的函數):

sys.exit(globals()[sys.argv[1]](db, usr)) 

另一個方法是創建這個字典自己:

actions = {'add': add, 'rem': rem, 'rmusr': rmusr} 
if sys.argv[1] in actions: 
    sys.exit(actions[sys.argv[1]](db, usr)) 
+0

'actions'需要大括號'{}'來創建一個字典;它目前是一個列表(實際上,你會得到一個語法錯誤)。 –

+0

是的,我忘了改變這些。 – wheeler

相關問題