[英]What's the best way to handle optional values in Python?
我有一個數據結構,可以用來跟蹤視頻游戲中的某些數據。
values = {
'kills': None,
'assists': None,
'deaths': None,
'minutes': None,
'seconds': None,
}
根據可用的數據,我隨即填寫values
。 但是,所有屬性都是可選的,並且可以為None
。 例如 kills
可以是12
或None
。 這一切都取決於我當時可用的數據。 我可以通過有一個對象來存儲數據來使它更好一些,但是我仍然會遇到這些可選值的問題。
在Python中處理此類可選內容的最佳方法是什么?
你的直覺是對的。 無需存儲所有可能的選項。 只需存儲適用的內容即可。
通常,我們不會將所有可能的None值存儲在字典中。 只需填寫非None值,然后使用dict.get()方法獲取值:
>>> options = {'weapon': 'dagger'}
>>> print(options.get('weapon'))
dagger
>>> print(options.get('food'))
None
如果所有值都是數字,請考慮使用collections.Counter() ,它使可選條目默認為零:
>>> from collections import Counter
>>> options = Counter(kills=4, deaths=2)
>>> options['kills']
4
>>> options['deaths'] += 1
>>> options['deaths']
3
>>> options['assists']
0
使用實例或類時,使用getattr()函數可以為屬性查找提供特定的默認值。 實例方法對於跟蹤每個玩家的數據特別有用:
>>> anka = Player()
>>> vlad = Player()
>>> anka.hits = 5
>>> vlad.assists = 2
>>> print(getattr(anka, 'hits', None))
5
>>> print(getattr(vlad, 'hits', None))
None
ChainMap類使您可以將字典對鏈接在一起,以將它們視為單個實體。
>>> from collections import ChainMap
>>> defaults = ChainMap(dict(kills=0, assists=0, location='start', status='alive'))
>>> anka = defaults.new_child()
>>> vlad = defaults.new_child()
>>> anka['hits'] = 5
>>> vlad['assists'] = 2
>>> anka['hits']
5
>>> vlad['location']
'start'
最后一種解決方案使您可以在一個地方組織所有可能的默認值,同時讓實例僅存儲所需的數據。 它還提供了簡單的字典訪問,因此不需要每次查詢都需要get()或getattr() 。
希望這些解決方案之一適合您的問題:-)
如果您根本不想在需要之前初始化鍵,則可以使用collections包中的defaultdict快速插入新鍵,而無需初始設置鍵值對。
from collections import defaultdict
values = defaultdict(int)
values['seconds'] += 1
values['assists'] += 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.