Python の @dataclass
以外のレッスンには、ある程度余分な特徴がありますか?
私は を構成します以前 — そしてちょっと有名なことに — @dataclass
の元先祖 について好意的に 書きました*)attrs, そして、最も有名なすべての問題のためにそれを平和的に誓うために必要な最も効果的な工夫.
その時, attrs
は、以前は追加の依存関係でした。これは、特定のコードをより適切に作成するために Python スタックにアクセスする可能性が高い、おそらく不可欠なスキルの一部です。 私はそれを強く主張しましたが、ブランドのオリジナル要素の誓いにはあまりにも定期的な暗黙の理由があります. これは以前は追加の依存関係でしたが、おそらく、他の 種類の宣言のための便利なメカニズムと相互運用できなくなった可能性があります。あなたはすでに (つまり NamedTuple
) の誓いを立てていたのですが、既存のツールに精通している他の Python プログラマーから見たら、おそらく奇妙に見えるかもしれません。 私は、これらのどれも ただの 対位法であったとは思いません。
しかし、何十年もの間、データクラスは — そして現時点では — に-言語 に構築されます。 それらはツールチェーンの深いレベルでますます組み込まれているため、アプリケーション コードやその他の特殊なツールでさえ複製するのは神経をすり減らすことになります。 誰もが彼らが何であるかを知っています。
たとえば、2 次元で @dataclass
で概説されている教訓は です。
mypyc
でアセンブルすると同時にC構造として最適化されているように見えますが、場合によっては驚くほど機能するトリックであり、attrs 自体でさえ に追いつくために努力しています。
これはすべて私に疑問を投げかけます: 以前の下位互換性はありますか? 任意の ディスプレイ@dataclass
以外のレッスンをある程度余分に持っていますか? それらを元のコードで書く正当な理由は残っていますか?
attrs から dataclasses に変換された私の通常の例を考えてみてください。 まず、非データクラス モデル:
、
クラス Point3D : def __init__ (自分, x , y 、
z): 自分 = × 自己 .
y =y 自分 .z =z
そして今、データクラス 1:
、 から データクラス インポート データクラス @dataclass クラス Point3D : x : int
y
:
int z
: 整数
かなりの数の私の通常の側面が平和に立っています。 繰り返しが少なく平和です。 より少ない文字で、より多くの知識を真剣に表現し、より効率的 (
、repr
、ソート、ハッシュなど) を獲得しました。 カテゴリの厳しさに伴うマイナス面はあまり知られていないようで、typing.Any
がビルトインだった場合、x: any
コードを過度に制限したくない場合は、おそらくおそらく十分に満足できるでしょう。インポートが必要です。 この時点で、最も優れているのはどれですか... 複雑ですか? これを書いたほうがいいのではないでしょうか:: 整数 クラス Point3D : × : int y ): int z
そして、デコレーターのセマンティクスを使用して球面をいじり、Mypy (または Pyright または Pyre) の種類テスト間のバリエーションをごまかしたくない-time と Mypyc または Cython がアセンブルルタイム? さらに重要なのは、Python の最初の学習者にこれらすべての奇妙で小さな違いの複雑さを 印象付けたくないということです。 class
の前に import
を羽毛布団にしたい?
これらのツールはすべて既に @dataclass
デコレータは完全に特定の言語形式であり、実際にはデコレータを少しも喜ばないため、実際にデコレータに出くわすには、多様なケースを印象づける必要があります。多様化したケース の 多様化したケース。 特定のケース のこの特定のケースの拡張フック
元の構文が必要ない場合は、 from __future__ import dataclassification
またはそのようなものが必要になりますが、とはいえ、これは特にどうしようもないバーで楽しめそうにありません
- ちょっと教えてください
特に:
- 親切な注釈をまったく喜ばないでください。また、
dataclassification
を持つ特性からコードを移植するときに、その工夫にぎこちない暗黙の調整が行われる可能性は十分にあります。 ) が少なくとも 1 つ有効になっているため、おそらく完全にオリジナルの明確な構文が装備されているように見えます。 def
の括弧の工夫をより厳密に反映しているものは、魅力的な継承 (これを気に入るかどうかにかかわらず、明らかに中心から離れている機能です)。クラス定義は、「どのフィールドが構成するか」よりも)、所有する構文の共有にオフ: 、データ Point3D (x : int ,
y
:
これは、「私は喜ばない」現物」の条件付きで、おそらく最小限のケースでこれに減少する可能性があります:
、
データ Point3D (x, y
,
z ): クリープ 教育的に考えるのも楽しいし、たまりやすいし説得力があるdef foo(x, y, z):...
から data Foo(x, y, z):...
@dataclass class Foo: x: int...
.
に対してこれに伴うセマンティック調整の必要性。経験の浅い人が @dataclass
構文の回りくどい歴史的ルートを押しのけて、読みやすい形式で所有種を定義するように直接調達することを実行できるようにするのが最善です。 repr
s は、Python クロールの最初から
(そして、ボイラープレートの簡単な例の数行をスキップできるようにします。
私はただし、皆さんの考えを知るのは独特です。 私を撃ってください
電子メール
または中止する理由があると思う一連のダンダー手法を使用してレッスンを定義するための工夫は、データクラスよりも優れたままです。それとも、以前の「互換性」の理由から、長い風に平和的に固執する必要がありますか?
「互換性」が構文を処理するのに十分な動機であり、キル イン サイトを使用しないと考えるのをやめてください。私はこれに喜びのキーワードを追加するという指定を過小評価していますか? 商取引は平和的に行わなければならないと考えている場合、次のように決めますか:
__future__
インポートを介して class
自体のその工夫を変更する、 ブランドオリジナルのデータ
キーワードで提案したもので、 私が提案したものを完全に喜ばせることができるブランドのオリジナルのキーワードですが、実際には通知データ
の束を自転車に乗りたいと思っています,
dataclass
と field
を配置することで、さらに大きな喜びが得られます。 それとも、ここで考えもしなかったオプションですか? 溜まったらもう一人じゃないこの機会に消えていく Python ダイアログ ボード をより実質的に構成するダイアログ...
ありがとうございます 私のパトロン
私が転向しようとしている間、私を助けてくれる人…それが何であれ…立ち上げに加えて、維持とアプリケーションの傾向を提供し、正確な仕事に固執します。 この 1 つの余分なソリューションの喜びを追求する私を見る必要があることをやめますか? その場合は、可能性として を与えることができます。 Patreonでもブーストしてください! %%item_read_more_button %%