16

コードに型の注釈を付けようとしていますが、セットに関しては少し混乱しています。PEP 484のいくつかのポイントを読みました:

注: Dict 、 List 、 Set 、および FrozenSet は、主に戻り値に注釈を付けるのに役立ちます。引数には、 Mapping 、 Sequence 、 AbstractSet など、以下で定義されている抽象コレクション型を優先します。

セットは AbstractSet に名前が変更されました。この名前の変更が必要だったのは、typing モジュールの Set がジェネリックスを使用した set() を意味するためです。

しかし、これは役に立ちません。

私の最初の質問は、Set、FrozenSet、MutableSet、および AbstractSet の共通点と相違点は何ですか?

私の2番目の質問は、なぜ私が試したら

from collections import FrozenSet

私は得る

ImportError: cannot import name 'FrozenSet'

?

私は Python 3.4 を使用しており、pip 経由で mypy-lang をインストールしました。

4

4 に答える 4

5

注釈と入力には注意してください。484 で説明されているアイデアはまったく新しいものであり、typingモジュールに実装されています。そのモジュールは Python3.5 でのみ利用可能です (最新のものはPy2 と Py3 の両方でtyping利用可能です)。pip

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

あなたが引用したメモは、484 の次のセクションからのものです。

静的型チェックの使用を Python 3.5 および古いバージョンに開放するには、統一された名前空間が必要です。この目的のために、標準ライブラリには、typing と呼ばれる新しいモジュールが導入されています。

メモにリストされているものは、実際のオブジェクト クラス (組み込みまたは from collections) ではなく、注釈型です。2 つを混同しないでください。

関数 (および型名)はDict, List, ,です。つまり、辞書を作成するには、使用するか、使用しないかを指定します。SetFrozenSetdictlistsetfrozensetdict(){}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 バックポート) にFrozenSet定義がありますが、 . その意味がよくわかりません。python2/typing.pysrc/typing.py

于 2016-03-10T04:50:21.843 に答える
1

セットの型は変更可能です。内容は、add() や remove() などのメソッドを使用して変更できます。これは可変であるため、ハッシュ値を持たず、辞書のキーや別のセットの要素として使用することはできません。frozenset 型は不変かつハッシュ可能です。作成後にその内容を変更することはできません。ただし、辞書キーまたは別のセットの要素として使用できます。

から: https://docs.python.org/3/library/stdtypes.html#frozenset

含める必要はありません。組み込みなので、次のようにします。

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

3.4.2でテスト済み

于 2016-03-10T04:09:56.030 に答える