2016-03-10 73 views
5

我想用類型註釋我的代碼,但是當涉及到集合時我有點困惑。我讀了PEP 484中的一些點:python打字模塊中的Set,FrozenSet,MutableSet和AbstractSet之間有什麼區別?

注意:Dict,List,Set和FrozenSet主要用於註釋返回值。對於參數,更喜歡下面定義的抽象集合類型,例如映射,序列或抽象集。

設置,更名爲AbstractSet。此名稱更改是必需的,因爲在打字模塊中設置意味着帶有泛型的set()。

但這沒有幫助。

我的第一個問題是:Set,FrozenSet,MutableSet和AbstractSet的共同點和區別是什麼?

我的第二個問題是:爲什麼如果我嘗試

from collections import FrozenSet 

我得到

ImportError: cannot import name 'FrozenSet' 

我正在使用Python 3.4,我已經通過pip安裝了mypy-lang。

回答

3

測試小心註釋和打字。 484中討論的想法是全新的,並在typing模塊中實施。該模塊僅在Python3.5中可用(對於Py2和Py3,最新的typing也可從pip獲得)。

https://docs.python.org/3/library/typing.html

需要注意的是你報的也就是從484開始部分:

要打開靜態類型的使用檢查到Python 3.5,以及舊版本,一個統一的命名空間需要。爲此,引入了標準庫中的新模塊,稱爲打字。

註釋列出的內容是註釋類型,而不是實際的對象類(內置或從collections)。不要混淆兩者。

注意DictListSetFrozenSet都是大寫的,其中的功能(和類型名稱)是dictlistsetfrozenset。換句話說,要製作字典,您使用dict(){},而不是Dict

註解是新的3.0(根本不在2.n中)。在一個普通的解釋器中,他們所做的就是填充函數的__annotations__字典。解釋器中沒有任何內容使用或需要註釋。

http://mypy-lang.org/描述自己作爲一個實驗性的打字檢查。你需要看看它的文檔,看它是如何與484等兼容。

https://docs.python.org/3/library/collections.abc.html#module-collections.abc有一些抽象的定義,我相信typing使用。我從來沒有使用過這些。它們主要針對開發新類對象的人,而不是「常規」用戶。

這個問題的typing標記可能不是一個好主意。它沒有太多的追隨者,並且過於通用。它不涉及這個Python模塊。

搜索[python] 484對於處理這種註釋風格的其他SO問題。

https://github.com/python/typing - typing開發存儲庫。

在此存儲庫中,在python2/typing.py文件(python2 backport)中有FrozenSet定義,但不在src/typing.py中。我不確定這一點的重要性。

+0

嗨,謝謝你的回覆。我現在有了更清晰的想法(我知道註釋類型和對象之間的區別,但不知道mypy的輸入與python3.5的輸入模塊)。但是,我查看了兩份文檔,找不到FrozenSet的引用,這在PEP 484中提到。我錯過了什麼嗎? – marcotama

+0

看起來他們還沒有將'FrozenSet'添加到'typing'中。 'typing'中的許多類映射到'collections.abc',其中包含'MutableSet'和'AbstractSet',但不包含'FrozenSet'。所以在這一點上'FrozenSet'只是PEP中的一個想法,僅此而已。 – hpaulj

+0

「打字」模塊有一個github存儲庫。探索一下,看看未來會增加什麼。 – hpaulj

-1

這些都用於不同的事情。

集非常相似,設置的數學概念:https://en.wikipedia.org/wiki/Set_(mathematics)

一組Python是實質上唯一對象的集合。您可以閱讀關於集合的更多信息,以及在此處看到的一些示例:http://www.python-course.eu/python3_sets_frozensets.php

Python中的集合是獨特對象(全部是不可變的)的集合,但FrozenSet是不可變的。這意味着您可以更改Set,但不能更改FrozenSet:您需要創建一個新的FrozenSet。

在Python3,FrozenSet是稱爲「frozenset」默認參數

+0

嗨,當我回復lciamp時,我知道set和frozenset之間的區別。我的問題是特定於打字模塊,因此是大寫字母。如果我不清楚,我很抱歉。 – marcotama

0

的集類型是可變的 - 內容可以使用像添加方法()來改變和刪除()。由於它是可變的,因此它沒有散列值,不能用作字典鍵或另一個集的元素。 frozenset類型是不可變的且可散列的 - 其內容在創建後不能更改;但是,它可以用作字典鍵或另一個集的元素。

來自:https://docs.python.org/3/library/stdtypes.html#frozenset

您不需要包括它,它是內置的,你只是做:

cities = frozenset(["Frankfurt", "Basel","Freiburg"])

3.4.2

+0

謝謝,我知道這些差異。問題是關於這些類型如何映射到打字模塊中。如果我不清楚,我很抱歉。 – marcotama

相關問題