2011-06-19 92 views
0

我試圖更改Python類的字典,以便每次將函數對象添加到字典中時,我都會添加我的類的實例,而我將其重新定義爲__call__。 我使用的字典類的元類和__setitem__的自定義字典我正在實例化我用來更改添加函數的行爲的類,並向字典中添加一個不是NoneType對象。但是,當我用包裝的函數實例化類並嘗試調用相應的函數時,我得到一個「NoneType not callable」錯誤,並且我在類字典中包裝的函數對象爲= None。任何想法,爲什麼這可能發生?謝謝!在Python類字典中更改值時的無類型

+3

可能想向我們展示您的實際代碼。 – FogleBird

+0

添加了代碼10x。雖然沒有正確格式化。我會看看能做些什麼。 – asenovm

+0

@iLate,看起來像你有一個標籤和空格的混合。 (標籤和空格的混合笑起來很不錯...)。 – senderle

回答

2

我開始準備 - 是張貼代碼的實際代碼?它在Python 3.2下實際上並不適用 - 我已經修復了一下。下面是我變了,開始:現在

class_dict = list() 

class_dict = {} 

OverloadedFunction.__call__

for fkey, function in class_dict.items(): 
    inspect_t = inspect.getfullargspec(function) 
    print(inspect_t) 

member_dict.__setitem__

if value.__class__.__name__ == "function": 
    class_dict[key] = value 
    dict.__setitem__(self,key,OverloadedFunction(key,value)) 

我相信這是你的意圖nded。我從來沒有得到NoneType not callable錯誤 - 這些修改(加import inspect頂部),你的代碼的作品,並打印參數規格:

$ python3 temp.py 
FullArgSpec(args=['self', 'a', 'b'], varargs=None, varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={'a': <class '__main__.Asteroid'>, 'b': <class '__main__.Asteroid'>}) 

現在,你要實現的多重方法 - 修改我做了排除,由於您的多方法在每次調用__setitem__時被覆蓋,因此您可以從那裏開始工作(也許可以使用collections.defaultdict(list)append改爲class_dict[key])。

我可以提出一些建議嗎?我不認爲你需要一個元類 - http://www.artima.com/weblogs/viewpost.jsp?thread=101605爲Python 2.x提供了一個多方法實現,這非常簡單。

+0

10倍,爲答案!:)是的,這是我的實際代碼,它爲我工作(我沒有複製導入)。但class_dict不能是一個字典(因爲這裏的重點是添加多個函數一個和相同的名稱,它們的區別僅在於它們的參數的註釋,如果我們使用了一個字典(這種方法只會添加最後一個函數),那麼這個名稱是不能做到的。我想檢查碰撞被調用的參數的類型這就是爲什麼我要檢查什麼傳遞給__call__而不是什麼在class_dict(我會從class_dict調用函數,一旦我看到哪一個我應該調用) – asenovm

+0

@iLate,是分配使用元類,multimethods ,或者兩者都不是?如果它是後兩者之一,那麼你應該看看那篇文章 - 它很簡單。 – senderle

+0

該鏈接的+1,特別是btw。 – senderle

2

我不知道你究竟做了什麼,但你可能會發現setdefault有用:

setdefault(鍵[,默認值])

如果關鍵是在字典 ,返回它的價值。 如果不是,插入鍵值爲 默認並返回默認值。默認 默認爲無。

詳細信息:Use cases for the 'setdefault' dict method