Pythonファイルの一般的なヘッダー形式は何ですか?


508

Pythonコーディングガイドラインに関するドキュメントで、Pythonソースファイルの次のヘッダー形式に遭遇しました。

#!/usr/bin/env python

"""Foobar.py: Description of what foobar does."""

__author__      = "Barack Obama"
__copyright__   = "Copyright 2009, Planet Earth"

これはPythonの世界のヘッダーの標準形式ですか?他にどのようなフィールド/情報をヘッダーに入れることができますか?Pythonの達人は、Pythonソースヘッダーのガイドラインを共有します:-)


ここから始めるのが良いでしょう:PEP 257は、Docstringsについて話し、他のいくつかの関連ドキュメントへのリンクです。
ピーター、

41
おそらく、この質問に対するさまざまな回答を読んでいる人にとって有用なガイドラインは、これらのファイルヘッダーの使用目的を検討することです。具体的なユースケースがある場合(たとえば、開発者がすべてのファイルに著作権情報を入れられなかったために裁判所の訴訟は失われると私の弁護士が言った場合)、そのユースケースに必要な情報を追加して維持します。そうでなければ、あなたはあなたのOCDフェチをただふけるだけです。
Jonathan Hartley

ほんとすごい@JonathanHartley!私自身のプロジェクトでは、あなたが言うように、「OCDフェチにふける」。hahaaha stackoverflow.com/a/51914806/1896134
JayRizzo 2018

回答:


577

Foobarモジュールのすべてのメタデータ。

最初のものはdocstringモジュールのであり、ピーターの回答ですでに説明されています

モジュール(ソースファイル)を整理するにはどうすればよいですか?(アーカイブ)

各ファイルの最初の行はです#!/usr/bin/env pythonこれにより、たとえばCGIコンテキストなどでインタプリタを暗黙的に呼び出すスクリプトとしてファイルを実行できます。

次は、説明付きのdocstringです。説明が長い場合、最初の行は、それ自体で意味のある短い要約であり、残りは改行で区切られている必要があります。

importステートメントを含むすべてのコードは、docstringに従う必要があります。そうしないと、docstringはインタープリターによって認識されず、対話型セッション(つまりを介したobj.__doc__)で、または自動ツールでドキュメントを生成するときにアクセスできなくなります。

最初に組み込みモジュールをインポートし、次にサードパーティモジュールをインポートしてから、パスと独自のモジュールを変更します。特に、モジュールのパスと名前への追加は急速に変化する可能性があります。1か所にまとめておくと、モジュールを見つけやすくなります。

次は著者情報です。この情報は、次の形式に従う必要があります。

__author__ = "Rob Knight, Gavin Huttley, and Peter Maxwell"
__copyright__ = "Copyright 2007, The Cogent Project"
__credits__ = ["Rob Knight", "Peter Maxwell", "Gavin Huttley",
                    "Matthew Wakefield"]
__license__ = "GPL"
__version__ = "1.0.1"
__maintainer__ = "Rob Knight"
__email__ = "rob@spot.colorado.edu"
__status__ = "Production"

ステータスは通常、「プロトタイプ」、「開発」、または「本番」のいずれかである必要があります。__maintainer__バグを修正し、インポートされた場合は改善を行う人である必要があります。__credits__異なっ__author__という点では、__credits__などのバグ修正、作られた提案を、報告されたが、実際にコードを書いていない人が含まれています。

ここであなたはより多くの情報を持っている、リスト__author____authors____contact____copyright____license____deprecated____date__および__version__認識しメタデータとして。


7
ヘッダー情報の作成を新しいファイル用に自動化できますか?
Hauke、

184
インポート後のこのメタデータはすべて悪い考えだと思います。このメタデータの単一のファイルに適用される部分(作成者、日付など)は、ソース管理によってすでに追跡されています。ファイル自体に同じ情報の誤った古くなったコピーを入れることは私には間違っているようです。プロジェクト全体に適用される部分(ライセンス、バージョン管理など)は、すべてのソースコードファイルではなく、プロジェクトレベルで、独自のファイルに配置する方がよいようです。
ジョナサンハートレー

28
Jonathan Hartleyと完全に同意します。次にコードを継承する人には3つの選択肢があります。1)コードを編集するたびにすべてを更新する2)そのままにしておく、その場合は不正確になる3)すべてを削除する オプション1は、メタデータが受信時に最新であるという確信がまったくないため、時間の浪費です。オプション2と3は、そもそもそれをそこに置くための時間が無駄だったことを意味します。解決策:全員の時間を節約し、そこに置かないでください。
spookylukey

77
ほとんどのPythonファイルにシバン行がある理由はありません。
マイクグラハム

15
PEP 8によると__version__、メインのdocstringの直後に、前後に空白行を置く必要があります。また、シバンのすぐ下に文字セットを定義することをお勧めします# -*- coding: utf-8 -*-
Dave Lasley 2014年

179

最小限のファイルヘッダーを強く支持します。

  • #!これが実行可能なスクリプトの場合、ハッシュバング(行)
  • モジュールdocstring
  • 標準的な方法でグループ化されたインポート。例:
  import os    # standard library
  import sys

  import requests  # 3rd party packages

  import mypackage.mymodule  # local source
  import mypackage.myothermodule  

すなわち。インポートの3つのグループ。それらの間に1つの空白行があります。各グループ内で、インポートはソートされます。最後のグループであるローカルソースからのインポートは、図のように絶対インポートにすることも、明示的な相対インポートにすることもできます。

他のすべては時間と視覚空間の無駄であり、積極的に誤解を招くものです。

法的免責事項またはライセンス情報がある場合、それは別のファイルに入ります。すべてのソースコードファイルに感染する必要はありません。あなたの著作権はこれの一部であるべきです。LICENSEランダムなソースコードではなく、ファイル内で見つけられるようにする必要があります。

著者や日付などのメタデータは、ソース管理によってすでに維持されています。詳細情報が少なく、エラーがあり、古いバージョンの同じ情報をファイル自体に追加する必要はありません。

誰もがすべてのソースファイルに入力する必要がある他のデータがあるとは思いません。あなたにはそうするための特定の要件があるかもしれませんが、そのような事柄は、定義により、あなただけに適用されます。それらは、「すべての人に推奨される一般的なヘッダー」にはありません。


23
これ以上同意できませんでした-複数の場所でコードを複製するのは罪なので、なぜヘッダー情報についても同じことをします。それを1か所(プロジェクトルート)に置き、そのような情報を多数のファイルにわたって管理する手間を省きます。
グレーム

13
ソース管理はより有効な著者情報を提供する傾向があることに私は同意しますが、著者はリポジトリへのアクセスを許可せずにソースのみを配布する場合があります。したがって、著者情報をモジュールヘッダーとして埋め込むことは依然として有益です。
乳母車

6
ねえ、乳母車。それが実際に役立つユースケースを思い描くのに苦労しています。プロジェクト全体の著者情報を知りたい人がいると想像できます。彼らは、主要な貢献者のリストから1つの中心的な場所(おそらくプロジェクトのREADMEまたはドキュメント)から価値を得ることができます。しかし、(a)個々のファイルの作成者を知りたい、(b)ソースリポジトリにアクセスできない、(c)情報が間違っているかどうかを判断する方法がないことを気にしない人は誰でしょうか。時代遅れ?
ジョナサンハートレー

12
多くのライセンスでは、非常に正当な理由により、各ファイルにライセンスボイラープレートを含める必要があります。誰かが1つまたは2つのファイルを取得し、ライセンスなしでそれらを再配布する場合、そのファイルを受け取った人は、どのライセンスに基づいているのかわからず、それを追跡する必要があります(彼らが誠実であると仮定します)。
nyuszika7h 2015

3
__version__ただし、多くのモジュール(scipy、numpy、matplotlib)にはメタデータが含まれており、プログラムからアクセスでき、対話型インタープリターですばやくチェックできるため、メタデータを使用することをお勧めします。ただし、著者情報と法的情報は別のファイルに属しています。ユースケースがない限りif 'Rob' in __author__:
内部石

34

上記の答えは本当に完全ですが、すばやくダーティなヘッダーをコピーして貼り付けたい場合は、これを使用してください:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Module documentation goes here
   and here
   and ...
"""

なぜこれが良いのか:

  • 最初の行は* nixユーザー向けです。ユーザーパスでPythonインタープリターが選択されるため、ユーザーが優先するインタープリターが自動的に選択されます。
  • 2つ目はファイルのエンコードです。現在、すべてのファイルにはエンコーディングが関連付けられている必要があります。UTF-8はどこでも機能します。レガシープロジェクトは他のエンコーディングを使用します。
  • そして、非常にシンプルなドキュメント。複数行を埋めることができます。

以下も参照してください。 https //www.python.org/dev/peps/pep-0263/

各ファイルにクラスを記述するだけの場合、ドキュメントは必要ありません(クラスドキュメント内にあります)。


5
>「最近では、すべてのファイルにエンコードが関連付けられている必要があります。」これは誤解を招くようです。utf8がデフォルトのエンコーディングであるため、指定しないことで問題ありません。
ジョナサンハートレー

23

非ASCII文字セットを使用している場合は、PEP 263も参照してください。

概要

このPEPは、Pythonソースファイルのエンコーディングを宣言する構文を導入することを提案しています。エンコーディング情報は、Pythonパーサーによって使用され、指定されたエンコーディングを使用してファイルを解釈します。特に、これにより、ソースコード内のUnicodeリテラルの解釈が強化され、Unicode対応のエディターで直接UTF-8などを使用してUnicodeリテラルを書き込むことが可能になります。

問題

Python 2.1では、Unicodeリテラルは、Latin-1ベースのエンコーディング「unicode-escape」を使用してのみ記述できます。これにより、多くのアジア諸国など、Latin-1以外のロケールで生活して作業するPythonユーザーにとって、プログラミング環境はやや不便になります。プログラマーは好みのエンコーディングを使用して8ビット文字列を書き込むことができますが、Unicodeリテラルの「ユニコードエスケープ」エンコーディングにバインドされています。

提案されたソリューション

ファイルの先頭にある特別なコメントを使用してエンコーディングを宣言することにより、ソースファイルごとにPythonソースコードエンコーディングを表示および変更可能にすることを提案します。

Pythonにこのエンコーディング宣言を認識させるには、Pythonソースコードデータの処理に関して、いくつかの概念の変更が必要です。

エンコーディングの定義

他のエンコーディングヒントが指定されていない場合、Pythonはデフォルトで標準エンコーディングとしてASCIIを使用します。

ソースコードエンコーディングを定義するには、次のように、ファイルの1行目または2行目としてソースファイルにマジックコメントを配置する必要があります。

      # coding=<encoding name>

または(人気のあるエディターによって認識されるフォーマットを使用)

      #!/usr/bin/python
      # -*- coding: <encoding name> -*-

または

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :

...


15
Python 3以降、デフォルトの文字セットはUTF-8であることに注意してください。
nyuszika7h 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.