簡體   English   中英

在Python中處理可選值的最佳方法是什么?

[英]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可以是12None 這一切都取決於我當時可用的數據。 我可以通過有一個對象來存儲數據來使它更好一些,但是我仍然會遇到這些可選值的問題。

在Python中處理此類可選內容的最佳方法是什么?

你的直覺是對的。 無需存儲所有可能的選項。 只需存儲適用的內容即可。

解決方案1:使用get()而不是存儲無

通常,我們不會將所有可能的None值存儲在字典中。 只需填寫非None值,然后使用dict.get()方法獲取值:

>>> options = {'weapon': 'dagger'}
>>> print(options.get('weapon'))
dagger
>>> print(options.get('food'))
None

解決方案2:數字數據的計數器默認為零

如果所有值都是數字,請考慮使用collections.Counter() ,它使可選條目默認為零:

>>> from collections import Counter
>>> options = Counter(kills=4, deaths=2)
>>> options['kills']
4
>>> options['deaths'] += 1
>>> options['deaths']
3
>>> options['assists']
0

解決方案3:getattr()用於實例或類中的可選數據

使用實例或類時,使用getattr()函數可以為屬性查找提供特定的默認值。 實例方法對於跟蹤每個玩家的數據特別有用:

>>> anka = Player()
>>> vlad = Player()
>>> anka.hits = 5
>>> vlad.assists = 2
>>> print(getattr(anka, 'hits', None))
5
>>> print(getattr(vlad, 'hits', None))
None

解決方案4:對於已知的默認設置,請使用ChainMap。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM