web-dev-qa-db-ja.com

Python namedtupleクラスの_replaceメソッドが保護されているのはなぜですか?

セクション メソッド名とインスタンス変数 では、Pythonスタイルガイド(別名PEP 0008))は、「非パブリックメソッドとインスタンス変数に対してのみ、1つの先行アンダースコアを使用する。 "では、なぜnamedtuple_replaceメソッドは先頭にアンダースコアがあるのですか?namedtupleクラス自体は_replaceをまったく呼び出さず、_replaceの存在はnamedtuple()(たとえば here を参照)。

9
kuzzooroo

namedtupleは、Pythonでは少し変わったものです。これは基本クラスではなく、クラスジェネレータです。これを呼び出すと、ストレージにタプルを使用する新しいクラスが作成され、名前付きフィールドを持つタプルまたは通常のクラスとして操作できます。

生成されたクラスは、メソッドと制約を追加する独自のタイプのbaseとして使用することを目的としています。個々のフィールドの値を結び付ける制約を含みます。

したがって、namedtupleは置き換えをサポートしないクラスのベースとして使用される可能性があります。また、派生クラスはそのベースが提供するメソッドを削除できないため、メソッドをパブリックにすることはできません。

ただし、一部の派生クラスはその機能を必要とする場合があります。そのため、内部メソッドとして提供されています。サブクラスは、それを適切に使用する場合にエクスポートできます。

7
Jan Hudec

namedtupledocumentation には次のように書かれています:

アンダースコアで始まる名前を除いて、有効な任意のPython識別子をフィールド名に使用できます。有効な識別子は、文字、数字、アンダースコアで構成されますが、数字またはアンダースコアで始まり、クラス、for、return、global、pass、print、raiseなどのキーワード。

namedtuplesには動的フィールド構造があるためです。識別子のリストを指定すると、関連するfieldsを持つクラスが作成されます。

動的フィールドタイプがあるため、開発者は_field_names_を柔軟にするために、できるだけ多くの条件を回避しようとします。ベースクラスメソッドにアンダースコア(_make()_replace()_asdict()および__fields_)を付けたため、フィールドにアンダースコアなしの名前を使用できます名前など。

識別子は数字で始めることはできず、クラスメソッドまたはプロパティまたはフィールドは、pythonでkeywordの名前を一般的なルールとして使用することはできません。namedtupleの最後のルールについて_field_name_アンダースコアで始まる名前は、namedtupleクラスのメソッド名とプロパティ名のために予約されているため、使用できません。

6
FallenAngel

これは明らかにnamedtupleメンバー(_replace_fields_field_defaults_make_asdict)は、namedtupleのユーザーが作成する可能性のあるフィールド名(キーなど)と衝突しません。これがあなたが提供したPEPと衝突するのは残念な副作用のようです。 (PyCharmのPEPの施行により_fieldsは「保護されたメンバーへのアクセス」として。イライラするが、深刻な問題ではない。)

https://docs.python.org/3/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields のドキュメントから:

タプルから継承されたメソッドに加えて、名前付きタプルは3つの追加メソッドと2つの属性をサポートします。フィールド名との競合を防ぐために、メソッド名と属性名は下線で始まります。

3
Mike