セクション メソッド名とインスタンス変数 では、Pythonスタイルガイド(別名PEP 0008))は、「非パブリックメソッドとインスタンス変数に対してのみ、1つの先行アンダースコアを使用する。 "では、なぜnamedtuple
の_replace
メソッドは先頭にアンダースコアがあるのですか?namedtuple
クラス自体は_replace
をまったく呼び出さず、_replace
の存在はnamedtuple()
(たとえば here を参照)。
namedtuple
は、Pythonでは少し変わったものです。これは基本クラスではなく、クラスジェネレータです。これを呼び出すと、ストレージにタプルを使用する新しいクラスが作成され、名前付きフィールドを持つタプルまたは通常のクラスとして操作できます。
生成されたクラスは、メソッドと制約を追加する独自のタイプのbaseとして使用することを目的としています。個々のフィールドの値を結び付ける制約を含みます。
したがって、namedtupleは置き換えをサポートしないクラスのベースとして使用される可能性があります。また、派生クラスはそのベースが提供するメソッドを削除できないため、メソッドをパブリックにすることはできません。
ただし、一部の派生クラスはその機能を必要とする場合があります。そのため、内部メソッドとして提供されています。サブクラスは、それを適切に使用する場合にエクスポートできます。
namedtuple
documentation には次のように書かれています:
アンダースコアで始まる名前を除いて、有効な任意のPython識別子をフィールド名に使用できます。有効な識別子は、文字、数字、アンダースコアで構成されますが、数字またはアンダースコアで始まり、クラス、for、return、global、pass、print、raiseなどのキーワード。
namedtuple
sには動的フィールド構造があるためです。識別子のリストを指定すると、関連するfield
sを持つクラスが作成されます。
動的フィールドタイプがあるため、開発者は_field_names
_を柔軟にするために、できるだけ多くの条件を回避しようとします。ベースクラスメソッドにアンダースコア(_make()
、_replace()
、_asdict()
および__fields
_)を付けたため、フィールドにアンダースコアなしの名前を使用できます名前など。
識別子は数字で始めることはできず、クラスメソッドまたはプロパティまたはフィールドは、pythonでkeyword
の名前を一般的なルールとして使用することはできません。namedtuple
の最後のルールについて_field_name
_アンダースコアで始まる名前は、namedtuple
クラスのメソッド名とプロパティ名のために予約されているため、使用できません。
これは明らかにnamedtuple
メンバー(_replace
、_fields
、_field_defaults
、_make
、_asdict
)は、namedtuple
のユーザーが作成する可能性のあるフィールド名(キーなど)と衝突しません。これがあなたが提供したPEPと衝突するのは残念な副作用のようです。 (PyCharmのPEPの施行により_fields
は「保護されたメンバーへのアクセス」として。イライラするが、深刻な問題ではない。)
タプルから継承されたメソッドに加えて、名前付きタプルは3つの追加メソッドと2つの属性をサポートします。フィールド名との競合を防ぐために、メソッド名と属性名は下線で始まります。