0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Addict:一個寫起來令人極其舒適的字典模塊

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-10-21 14:24 ? 次閱讀

Addit 是一個Python模塊,除了提供標準的字典語法外,Addit 生成的字典的值既可以使用屬性來獲取,也可以使用屬性進行設(shè)置。

這意味著你不用再寫這樣的字典了:

body = {
    'query': {
        'filtered': {
            'query': {
                'match': {'description': 'addictive'}
            },
            'filter': {
                'term': {'created_by': 'Mats'}
            }
        }
    }
}

相反,你只需編寫以下三行代碼就能完成目的:

body = Dict()
body.query.filtered.query.match.description = 'addictive'
body.query.filtered.filter.term.created_by = 'Mats'

1.安裝

你可以通過** pip **安裝:

pip install addict

或通過** conda :**

conda install addict -c conda-forge

Addit 在Python2.7+和Python3上都可以運行。

2.用法

Addict 繼承自字典,但在訪問和設(shè)置其值方面更加靈活。使用 Addict 的字典是一種樂趣!

設(shè)置嵌套詞典的項是極其舒服的:

>> > from addict import Dict
 >> > mapping = Dict()
 >> > mapping.a.b.c.d.e = 2
 >> > mapping
{'a': {'b': {'c': {'d': {'e': 2}}}}}

如果Dict是用任何可迭代值實例化的,它將遍歷并克隆這些值,然后寫入到對應(yīng)的屬性及值中,比如:

>> > mapping = {'a': [{'b': 3}, {'b': 3}]}
 >> > dictionary = Dict(mapping)
 >> > dictionary.a[0].b
3

但** mapping['a']不再與dictionary['a'] **相同。

> >> mapping['a'] is dictionary['a']
False

當然,此特點僅限于構(gòu)造函數(shù),而不是在使用屬性或設(shè)置值時:

>> > a = Dict()
 >> > b = [1, 2, 3]
 >> > a.b = b
 >> > a.b is b
True

3.要牢記的事情

記住,** int **不是有效的屬性名,因此必須使用 get/setitem 語法 設(shè)置/獲取 非字符串的 dict 鍵:

>> > addicted = Dict()
 >> > addicted.a.b.c.d.e = 2
 >> > addicted[2] = [1, 2, 3]
{2: [1, 2, 3], 'a': {'b': {'c': {'d': {'e': 2}}}}}

不過,你可以隨意混合使用這兩種語法:

>> > addicted.a.b['c'].d.e
2

4.屬性,如鍵、item等

Addit 不會讓你覆蓋** dict **的屬性,因此以下操作將不起作用:

> >> mapping = Dict()
> >> mapping.keys = 2
Traceback (most recent call last):
File "< stdin >", line 1, in < module >
 File "addict/addict.py", line 53, in __setattr__
 raise AttributeError("'Dict' object attribute '%s' is read-only" % name)
AttributeError: 'Dict' object attribute 'keys' is read-only

不過,使用下面這種方式就可以:

>> > a = Dict()
 >> > a['keys'] = 2
 >> > a
{'keys': 2}
 >> > a['keys']
2

5.默認值

對于不在字典中的鍵,Addit的行為如 ** defaultdict(Dict) ** ,因此丟失的鍵返回一個空的** Dict而不是拋出KeyError **如果此行為不是所需的,則可以使用以下方式恢復(fù)拋出KeyError:

>> > class DictNoDefault(Dict):
 >> >   def __missing__(self, key):
 >> >     raise KeyError(key)

但請注意,這樣會失去速記賦值功能( **addicted.a.b.c.d.e = 2 ** )

6.轉(zhuǎn)化為普通字典

如果你覺得將 Addict 傳遞到其他函數(shù)或模塊并不安全,請使用** to_dict() **方法,它返回會把 Addict 轉(zhuǎn)化為普通字典。

> >> regular_dict = my_addict.to_dict()
> >> regular_dict.a = 2
Traceback (most recent call last):
File "< stdin >", line 1, in < module >
 AttributeError: 'dict' object has no attribute 'a'

當您希望在幾行代碼中創(chuàng)建嵌套的字典,然后將其發(fā)送到不同的函數(shù)或模塊時,這非常適合:

body = Dict()
body.query.filtered.query.match.description = 'addictive'
body.query.filtered.filter.term.created_by = 'Mats'
third_party_module.search(query=body.to_dict())

7.計數(shù)

**Dict **輕松訪問和修改深度嵌套屬性的能力使其成為計數(shù)的理想選擇。使用Addict,你還可以容易允許按多個級別計數(shù),內(nèi)部使用的原理是 **collections.Counter ** 。

比如以下數(shù)據(jù):

data = [
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'F', 'eyes': 'green'},
    {'born': 1980, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'F', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'F', 'eyes': 'green'},
    {'born': 1981, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'F', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'M', 'eyes': 'green'},
    {'born': 1981, 'gender': 'F', 'eyes': 'blue'}
]

如果你想計算有多少人出生在born性別的gender使用eyes眼睛,你可以很容易地計算出這些信息

counter = Dict()

for row in data:
    born = row['born']
    gender = row['gender']
    eyes = row['eyes']

    counter[born][gender][eyes] += 1 print(counter)

# 結(jié)果:{1980: {'M': {'blue': 1, 'green': 3}, 'F': {'blue': 1, 'green': 1}}, 1981: {'M': {'blue': 2, 'green': 1}, 'F': {'blue': 2, 'green': 1}}}

8.更新

普通字典的更新方式如下:

>> > d = {'a': {'b': 3}}
 >> > d.update({'a': {'c': 4}})
 >> > print(d)
{'a': {'c': 4}}

** addict **的更新方式如下,它會遞歸并實際更新嵌套的字典:

>> > D = Dict({'a': {'b': 3}})
 >> > D.update({'a': {'c': 4}})
 >> > print(D)
{'a': {'b': 3, 'c': 4}}

9.Addict 是怎么來的?

這個模塊完全是從用Python創(chuàng)建Elasticsearch查詢的繁瑣過程中發(fā)展而來的。每當你發(fā)現(xiàn)自己在寫了很復(fù)雜的字典邏輯時,只要記住你沒有必要這樣做,使用 Addict 就行。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2630

    瀏覽量

    47233
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4700

    瀏覽量

    68117
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84309
收藏 人收藏

    評論

    相關(guān)推薦

    STM32F439單片機應(yīng)用資料

    最近公司在研發(fā)項目,使用的是STM32F439系列單片機,使用過程中發(fā)現(xiàn)這款芯片功能實在是太強大,不過程序編寫起來還是有點費勁,尤其是在U/COS11系統(tǒng)基礎(chǔ)上進行程序擴展時,遇到很多問題,希望有志同道合的朋友能共同學習,共
    發(fā)表于 05-16 13:22

    哪里可以下載到完整項目的程序和pcb,項目可大可小,

    只是想學習下如何做一個完整的項目,完整項目的程序寫起來應(yīng)該不會和stm32單個外設(shè)的操作吧,
    發(fā)表于 09-06 21:09

    索引數(shù)組

    有沒有什么方法能讓我索引不這麻煩,占地方,之后可能要要索引0-20,寫起來太麻煩了,想了下是不是可以用for循環(huán),不過沒成功。
    發(fā)表于 12-01 19:43

    請問如何用MSP430控制兩不同工作頻率的無線射頻芯片并使其自動切換?

    大家好,新人初入論壇,想請教下大家,我的課題需要用單片機控制兩不同的無線射頻芯片并使其根據(jù)環(huán)境自動切換,請問大神們能否為我提供下思路?用MSP430F149控制完成是否可行?程序寫起來難度如何?真的謝謝大家了??!
    發(fā)表于 08-07 20:48

    PIC32上的Python?

    Python是否已經(jīng)移植到PIC32。我不確定這是不是好主意,但是Python寫起來很快。 以上來自于百度翻譯 以下為原文 Has python ever been ported
    發(fā)表于 11-19 10:51

    請問在標準的C語言庫中有沒有能將一個字節(jié)轉(zhuǎn)換成兩個字符串的函數(shù)?

    一個字節(jié)轉(zhuǎn)換成兩個字符串,比如:0x4d。轉(zhuǎn)換成:‘4’,‘D’。之前都是自己寫的函數(shù)感覺每次寫起來太麻煩了想找個捷徑。
    發(fā)表于 04-04 06:35

    怎樣去設(shè)計基于溫濕度和煙霧傳感器的火災(zāi)檢測系統(tǒng)

    、MB-102電源模塊本來想把軟硬件寫在起,但后來發(fā)現(xiàn)內(nèi)容比較多,我寫起來比較花時間,讀者看起來應(yīng)該也挺累,索性拆開來,軟件部分后續(xù)補充。
    發(fā)表于 01-07 06:42

    Addict 寫起來令人極其舒適字典模塊

    Addit 是Python模塊,除了提供標準的字典語法外,Addit 生成的字典的值既可以使用屬性來獲取,也可以使用屬性進行設(shè)置。這意味
    發(fā)表于 06-21 16:13

    設(shè)計獨樹幟的新物件:JVC EXOFIELD XP-EXT1系統(tǒng)

    的特色和不同,寫起來簡單,看起來也并不麻煩。 但總有極少數(shù)的物件,它真的不屬于我們已知的任何類型,它是全新的,從形式到效果都是全新的。得承認這種東西并不大好寫,我甚至不大敢急著給它下定義,可是寫起來的時候心情又
    的頭像 發(fā)表于 11-01 11:44 ?2405次閱讀
    設(shè)計獨樹<b class='flag-5'>一</b>幟的新物件:JVC EXOFIELD XP-EXT1系統(tǒng)

    Python模塊Addit屬性設(shè)置

    Addit 是Python模塊,除了提供標準的字典語法外,Addit 生成的字典的值既可以使用屬性來獲取,也可以使用屬性進行設(shè)置。 這意
    的頭像 發(fā)表于 11-17 10:15 ?1356次閱讀

    python字典是什么

    python字典 字典(英文名 dict),它是由系列的鍵值(key-value)對組合而成的數(shù)據(jù)結(jié)構(gòu)。 字典中的每個鍵都與
    的頭像 發(fā)表于 02-23 16:54 ?3378次閱讀

    Python模塊Addict的安裝與使用

    Addit 是Python模塊,除了提供標準的字典語法外,Addit 生成的字典的值既可以使用屬性來獲取,也可以使用屬性進行設(shè)置。
    的頭像 發(fā)表于 06-21 16:14 ?2196次閱讀

    常見的幾種單片機編程框架

    程序框架其實就類似文件大綱或者模板。因為寫程序就和類似于寫文章,如果沒有大綱或者模板那么你寫起來就會比較費勁。
    的頭像 發(fā)表于 04-12 14:11 ?1482次閱讀

    盤點那些常見的單片機編程框架

    程序框架其實就類似文件大綱或者模板。因為寫程序就和類似于寫文章,如果沒有大綱或者模板那么你寫起來就會比較費勁。
    的頭像 發(fā)表于 04-23 15:57 ?624次閱讀
    盤點那些常見的單片機編程框架

    Addit:寫起來令人極其舒適字典模塊

    Addit 是Python模塊,除了提供標準的字典語法外,Addit 生成的字典的值既可以使用屬性來獲取,也可以使用屬性進行設(shè)置。 這意
    的頭像 發(fā)表于 10-30 09:56 ?509次閱讀