2013-07-10 25 views
2

我會如何去製作一個特殊的單身人士,如None? (我是新來的蟒蛇。)特殊單身人士(如無)

我希望能夠做這樣的事情:

def create_mutations(d): 
    return [ 
     Mutation(c, v) 
     if v is not CellAction.Delete else 
     Mutation(c, isDelete=True) 
     for (c, v) in d 
     ] 

像這樣來使用:

create_mutations({'a': 5, 'b': None, 'c': CellAction.Delete}) 

這將創建一個包含三個列表突變,意思是「設置a5,設置bNone,並刪除c」。

的一點是,在create_mutations的定義,我不能使用... if v is not None else ...,因爲再有就是之間的「設置bNone」,並沒有什麼區別「刪除b。」

我可以澄清問題是否不清楚。

回答

6

你可以只實例化您的模塊或類在某處object像這樣:

Delete = object() 

這足以讓大多數情況下。

+0

這工作得很好 - 我沒有意識到,你可以在定義類的文件中的頂層級別轉儲一行。 –

3

只需製作一些對象並命名即可。一個空的類就可以了:

class Delete: 
    pass 

或者,正如邁克爾指出,一個object實例。

如果您打算使用is進行測試,無論使用什麼對象都應該是可變的; Python有一個共享不可變對象實例的習慣。 (例如,所有空元組是相同的對象。)

+0

我見過幾個合併兩個答案的項目,並且有'DELETE = Delete()' –

+0

@JonathanVanasco這樣做的結果是什麼? – endolith

+0

使用'DELETE = object()',您必須始終檢查「if foo是否刪除」。使用'DELETE = Delete()',你可以使用'if isinstance(DELETE,Delete)'來檢查。根據你正在使用的是什麼,使用具有對象的'isinstance'可能更好。例如,如果你堅持數據(pickle,shelf,marshall等),'DELETE = object()'在你的程序的後續運行中會有所不同,並且不會與你的持久數據相匹配,但是測試一個自定義的'Delete班級仍然有效。 –

1

那麼,簡單的答案是你不能(嗯,你可能,但這不是你想要做的)。

你應該在這裏使用一個類,比如DeleteCell = object()(或者你可以有一個CellAction類或其中包含各種動作(其他類)的模塊)。