2013-11-22 26 views
-2

在下面的代碼的方法如何使Unicode數據callable.The錯誤,我得到的是//TypeError: 'unicode' object is not callable如何叫他的名字被存儲在一個變量

def test(test_config): 
    for i in test_config: 
     print i.header //prints func1 
     print type(i.header) // prints unicode 
     try: 
     #i.header()//TypeError: 'unicode' object is not callable 
     func = globals()[i.header] 
     print func # found it 
     func() 
     except AttributeError: 
     logging.error("Method %s not implemented"%(i.header)) 

    def func1(): 
     print "In func1" 

test(u'func1')  
+0

你嘗試調用其名*通過了'i.header'變量引用的方法? – shx2

+0

請參閱已更新的問題 – Rajeev

+1

當您打電話時,您期望它做什麼? –

回答

3

創建要使用字符串調用函數的字典:

def test(test_config): 
    for i in test_config: 
     print i.header //prints func1 
     print type(i.header) 
     try: 
     methods[i.header]() 
     except (AtributeError, TypeError): 
     logging.error("Method %s not implemented"%(i.header)) 

def func1(): 
    print "In func1" 
def func2(): 
    print "In func2" 

methods = {u'func1':func1, u'func2':func2} #Methods that you want to call 

使用類:

class A: 
    def test(self, test_config): 
     try: 
      getattr(self, i.header)() 
     except AtributeError: 
      logging.error("Method %s not implemented"%(i.header)) 

    def func1(self): 
     print "In func1" 
x = A() 
x.test(pass_something_here) 
+0

有沒有其他方式沒有使用字典? – Rajeev

+1

+1顯式字典應優先查找全局變量()。你不想不小心找到一個名爲「測試」的標題。 –

+0

@Rajeev然後使用一個類,然後你可以使用'getattr'調用這些方法。 –

3

如果我明白了,你想要什麼要做的是找到名稱被i.header變量引用的函數,然後調用它。 (標題很混亂,它使你想要使實際的實例可調用的印象)。

這是可以做到用了globals()

func = globals()[i.header] 
print func # found it 
func() # call it 
+1

如果這個想法是'i.header'包含一個函數的名字,像這樣的東西是讓它工作的最好方法。但它不是最好的想法 - 傳遞函數名稱,因爲數據不是完全安全的。如果你能找到不同的設計,比如直接傳遞函數對象,那會更好。 –

+0

func =全局變量()[i.header] KeyError:u'func1' – Rajeev

+0

這意味着名稱'func1'沒有在您嘗試訪問的位置定義。你可以請發表一個完整的例子,顯示如何得到這個錯誤? – shx2

1

這是一個使用裝飾器的好方法

header_handlers = {} 

def header_handler(f): 
    header_handlers[f.__name__] = f 
    return f 

def main(): 
    header_name = "func1" 
    header_handlers[header_name]() 

@header_handler 
def func1(): 
    print "func1" 

@header_handler 
def func2(): 
    print "func2" 

@header_handler 
def func3(): 
    print "func3" 

if __name__ == "__main__": 
    main() 

這種方式很明顯的功能是否是頭部處理器或不

相關問題