如果我理解正確,我會推薦collections.defaultdict。 這實際上並不是我稱之爲「開關」的聲明,但我認爲最終結果與您正在尋找的內容非常接近。
我可以最好地解釋完整的代碼,數據和應用程序。 顯然,關鍵路線是取消線路。
>>> import collections
>>>
>>> descriptions = {
... 'player_joined_clan' : '%(player)s joined clan %(clan)s',
... 'player_left' : '%(player)s left',
... 'player_hit_player' : '%(player)s (of %(clan)s) hit %(player2)s (of %(clan2)s)',
... }
>>>
>>> data = [
... {'player': 'PlayerA'},
... {'player': 'PlayerB', 'clan' : 'ClanB'},
... {'clan' : 'ClanC'},
... {'clan' : 'ClanDA', 'player2': 'PlayerDB'},
... ]
>>>
>>> for item in data:
... print item
... item = collections.defaultdict(lambda : '"<unknown>"', **item)
... for key in descriptions:
... print ' %s: %s' % (key, descriptions[key] % item)
... print
...
{'player': 'PlayerA'}
player_joined_clan: PlayerA joined clan "<unknown>"
player_left: PlayerA left
player_hit_player: PlayerA (of "<unknown>") hit "<unknown>" (of "<unknown>")
{'clan': 'ClanB', 'player': 'PlayerB'}
player_joined_clan: PlayerB joined clan ClanB
player_left: PlayerB left
player_hit_player: PlayerB (of ClanB) hit "<unknown>" (of "<unknown>")
{'clan': 'ClanC'}
player_joined_clan: "<unknown>" joined clan ClanC
player_left: "<unknown>" left
player_hit_player: "<unknown>" (of ClanC) hit "<unknown>" (of "<unknown>")
{'clan': 'ClanDA', 'player2': 'PlayerDB'}
player_joined_clan: "<unknown>" joined clan ClanDA
player_left: "<unknown>" left
player_hit_player: "<unknown>" (of ClanDA) hit PlayerDB (of "<unknown>")
或者,如果你想讓它更加個性化不是簡單地用一個字符串拉姆達,您可以定義自己的defaultdict類,如:
class my_defaultdict(collections.defaultdict):
def __missing__(self, key):
return '<unknown %s>' % key
行更改爲使用類,而不是默認之一:
#item = collections.defaultdict(lambda : '"<unknown>"', **item)
item = my_defaultdict(**item)
和,瞧,輸出:
{'player': 'PlayerA'}
player_joined_clan: PlayerA joined clan <unknown clan>
player_left: PlayerA left
player_hit_player: PlayerA (of <unknown clan>) hit <unknown player2> (of <unknown clan2>)
{'clan': 'ClanB', 'player': 'PlayerB'}
player_joined_clan: PlayerB joined clan ClanB
player_left: PlayerB left
player_hit_player: PlayerB (of ClanB) hit <unknown player2> (of <unknown clan2>)
{'clan': 'ClanC'}
player_joined_clan: <unknown player> joined clan ClanC
player_left: <unknown player> left
player_hit_player: <unknown player> (of ClanC) hit <unknown player2> (of <unknown clan2>)
{'clan': 'ClanDA', 'player2': 'PlayerDB'}
player_joined_clan: <unknown player> joined clan ClanDA
player_left: <unknown player> left
player_hit_player: <unknown player> (of ClanDA) hit PlayerDB (of <unknown clan2>)
有關更多示例,請參閱collections.defaultdict的文檔。
編輯:
我忘了,這__missing__
功能被添加到標準dict
類在Python 2.5。因此,一個更爲簡單的方法甚至不涉及collections.defaultdict
- 只要繼承dict
:
class my_defaultdict(dict):
def __missing__(self, key):
return '<unknown %s>' % key
這是不是一個真正的switch語句的問題,如[這一個](http://stackoverflow.com/questions/374239 /爲什麼 - 犯規 - 蟒蛇具備-A-switch語句)。這是一個字典與遺漏項目的問題。 – snapshoe 2010-09-27 03:18:14