2016-04-02 30 views
8

私はPythonの初心者です。私は、オンラインドキュメントと、良いPythonコードスタイルを持つためにPEP 0008に従う(試行)の両方を読んでいます。 私は再ライブラリについて勉強しながら、私は公式のPython docsで見つかったコード・セグメントについての好奇心:Token変数は大文字に最初の文字と命名された理由を私は理解できないPythonの命名規則 - namedtuples

import collections 

Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column']) 

。私はPEP 0008を読んできましたが、私が見たもののための参照はありません。 tokenまたは(それは私が知っている限りではありません)であればよいでしょうか?

+5

それはクラスだから - 'namedtuple'は、クラスファクトリです。 – jonrsharpe

答えて

9

指定したコードセグメントでは、Tokennamed tupleで、間違いなく定数です。それは、クラスファクトリ関数であるという事実に重点を置くためだけに、他の変数名命名スタイルに従わない。 tokenと書くと、PEP 0008スタイルチェッカー(たとえばPyCharmなど)からの警告は発生しませんが、この方法ではクラスファクトリ名として区別されません。

したがって、名前付きタプルは、PEP 0008のClass namesに該当します。それほど明示的には明示されていません。 あなたがwriting a tokenizerのために言及した例以外にも、これもcollections.namedtuple docs例で見ることができます。

Point = namedtuple('Point', ['x', 'y']) 
Point3D = namedtuple('Point3D', Point._fields + ('z',)) 
Book = namedtuple('Book', ['id', 'title', 'authors']) 
+0

アンチハパラの答えは私にそれを打つ。素晴らしい答え。 – Yannis

+0

あなたの答えはより良いです:d –

+0

両方の素晴らしい答え、私はPEP 0008へのリンクが本当に好きです。ありがとう – Karim

8

ここのキーはcollections.namedtupleです。ドキュメントが言うように、

collections.namedtuple(typename, field_names, verbose=False, rename=False)

typenameという名前の新しいtupleサブクラスを返します。新しいサブクラスを使用して、アトリビュートルックアップによってアクセス可能なフィールドと、インデックス可能で繰り返し可能なフィールドを持つ、tupleのようなオブジェクトを作成します。サブクラスのインスタンスには、便利なdocstring(typenameとfield_names)と便利な__repr__()メソッドがあり、これはタプルの内容をname=value形式でリストします。

PEP 8違反はありません。 Tokenはユーザー定義のクラスであり、その名前は大文字に変換されます。