파이썬 파일의 일반적인 헤더 형식은 무엇입니까?


508

Python 코딩 지침에 대한 문서에서 Python 소스 파일에 대한 다음 헤더 형식을 발견했습니다.

#!/usr/bin/env python

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

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

이것이 파이썬 세계에서 표준 헤더 형식입니까? 헤더에 어떤 다른 필드 / 정보를 넣을 수 있습니까? 파이썬 전문가들은 훌륭한 파이썬 소스 헤더에 대한 지침을 공유합니다 :-)


시작하기에 좋은 곳입니다 : PEP 257. Docstrings에 대해 말하고 다른 여러 관련 문서로 연결됩니다.
Peter

41
아마도이 질문에 대한 다른 대답을 읽는 사람들에게 유용한 지침은 이러한 파일 헤더가 사용될 목적을 고려하는 것입니다. 구체적인 유스 케이스가있는 경우 (예 : 내 변호사가 개발자가 모든 단일 파일에 저작권 정보를 입력하지 않아 법원 케이스가 유실되었다고 표시 한 경우) 해당 유스 케이스에 필요한 정보를 추가하고 유지 보수하십시오. 그렇지 않으면, 당신은 단지 OCD 페티쉬를 탐닉하고 있습니다.
Jonathan Hartley

하하 좋은 @JonathanHartley! 내 자신의 프로젝트를 위해 "나는 나의 OCD 페티쉬에 빠지다." hahaaha stackoverflow.com/a/51914806/1896134
JayRizzo 2018 년

답변:


577

Foobar모듈 의 모든 메타 데이터입니다 .

첫 번째 docstring모듈은 Peter의 답변 에서 이미 설명한 모듈 입니다.

모듈 (소스 파일)을 어떻게 구성합니까? (아카이브)

각 파일의 첫 줄은 다음과 같습니다 #!/usr/bin/env python. 이를 통해 파일을 인터프리터를 암시 적으로 호출하는 스크립트 (예 : CGI 컨텍스트)로 스크립트로 실행할 수 있습니다.

다음은 설명이있는 docstring이어야합니다. 설명이 길면 첫 번째 줄은 그 자체로 이해하기 쉬운 짧은 요약이어야하며 나머지 줄은 줄 바꿈으로 구분해야합니다.

import 문을 포함한 모든 코드는 docstring을 따라야합니다. 그렇지 않으면 인터프리터가 docstring을 인식하지 못하므로 대화식 세션 (예 :)에서 obj.__doc__또는 자동화 된 도구로 문서를 생성 할 때 해당 docstring에 액세스 할 수 없습니다 .

내장 모듈을 먼저 가져온 다음 타사 모듈을 가져온 다음 경로 및 자신의 모듈을 변경하십시오. 특히, 모듈의 경로와 이름에 대한 추가 사항은 빠르게 변경 될 수 있습니다. 한 곳에서 유지하면 쉽게 찾을 수 있습니다.

다음은 저작자 정보입니다. 이 정보는 다음 형식을 따라야합니다.

__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
가져 오기 후이 메타 데이터는 모두 나쁜 생각이라고 생각합니다. 단일 파일에 적용되는이 메타 데이터의 일부 (예 : 작성자, 날짜)는 이미 소스 제어에 의해 추적됩니다. 파일 자체에 같은 정보의 잘못되고 오래된 사본을 넣으면 나에게 잘못된 것 같습니다. 전체 프로젝트 (예 : 라이센스, 버전 관리)에 적용되는 부분은 모든 소스 코드 파일이 아닌 자체 파일로 프로젝트 수준에있는 것이 더 좋습니다.
Jonathan Hartley 2012

28
Jonathan Hartley와 완전히 동의하십시오. 코드를 상속받는 다음 사람은 세 가지 선택 사항이 있습니다. 1) 코드를 편집 할 때마다 코드를 업데이트합니다. 2) 코드를 내버려두면 부정확합니다. 3) 코드를 모두 삭제합니다. 옵션 1은 메타 데이터를받을 때 최신 상태라는 확신이 전혀 없기 때문에 시간 낭비입니다. 옵션 2와 3은 처음에 그것을 배치하는 데 시간이 낭비되었음을 의미합니다. 해결책 : 모든 사람의 시간을 절약하고 거기에 두지 마십시오.
spookylukey

77
대부분의 Python 파일에 shebang 행이있을 이유는 없습니다.
Mike Graham

15
PEP 8에 __version__따라 주 문서 문자열 바로 다음에 빈 줄이 있어야합니다. 또한 즉시 shebang 바로 아래에서 문자셋을 정의하는 것이 좋습니다.# -*- coding: utf-8 -*-
Dave Lasley

179

최소한의 파일 헤더를 강력하게 선호합니다.

  • #!실행 가능한 스크립트 인 경우 해시 뱅 ( 행)
  • 모듈 docstring
  • 표준 방식으로 그룹화 된 수입품 : 예 :
  import os    # standard library
  import sys

  import requests  # 3rd party packages

  import mypackage.mymodule  # local source
  import mypackage.myothermodule  

즉. 세 그룹의 수입 그룹 사이에 빈 줄이 하나 있습니다. 각 그룹 내에서 가져 오기가 정렬됩니다. 로컬 소스에서 가져 오는 최종 그룹은 표시된대로 절대 가져 오기이거나 명시 적 상대 가져 오기 일 수 있습니다.

다른 모든 것들은 시간 낭비, 시각적 공간이며, 오해의 소지가 있습니다.

법적 고지 사항이나 라이센스 정보가있는 경우 별도의 파일로 이동합니다. 모든 소스 코드 파일을 감염시킬 필요는 없습니다. 귀하의 저작권은 이것의 일부 여야합니다. 사람들은 LICENSE무작위 소스 코드가 아니라 파일 에서 찾을 수 있어야 합니다.

저작권 및 날짜와 같은 메타 데이터는 이미 소스 컨트롤에서 유지 관리합니다. 파일 자체에 동일한 정보의 상세하지 않고 잘못된 최신 버전을 추가 할 필요가 없습니다.

모든 사람이 모든 소스 파일에 넣어야하는 다른 데이터는 없다고 생각합니다. 특정 요구 사항이있을 수 있지만 그러한 정의는 정의에 따라 귀하에게만 적용됩니다. “모든 사람에게 권장되는 일반 헤더”에는 자리가 없습니다.


23
더 동의 할 수는 없습니다. 여러 곳에서 코드를 복제하는 것은 죄이므로 헤더 정보에 대해 동일한 것을 수행하십시오. 단일 위치 (프로젝트 루트)에 저장하고 많은 파일에서 이러한 정보를 유지 관리해야하는 번거 로움을 피하십시오.
Graeme

13
소스 제어가보다 유효한 저작권 정보를 제공하는 경향이 있지만 저자는 때때로 저장소에 액세스하지 않고 소스를 배포하거나 배포 작업 방식과 같은 방식 일 수도 있습니다 (예 : pypi의 중앙 집중식 설치). 따라서, 저작자 정보를 모듈 헤더로서 포함시키는 것이 여전히 유리하다.
pram

6
프램 실제로 유용한 유스 케이스를 구상하는 데 어려움을 겪고 있습니다. 프로젝트 전체에 대한 저작 정보를 알고 싶어하는 누군가를 상상할 수 있으며 프로젝트의 README 또는 문서와 같은 단일 중앙 위치의 주요 기고자 목록에서 가치를 얻을 수 있습니다. 그러나 누가 (a) 개별 파일 의 소유권을 알고 싶어 하고 (b) 소스 저장소에 액세스 할 수 없으며 (c) 정보가 잘못된 지 또는 오래된가요?
Jonathan Hartley

12
많은 라이센스는 매우 적절한 이유로 각 파일에 라이센스 상용구를 포함해야합니다. 누군가 라이센스 파일없이 파일을 가져 와서 재배포하는 경우, 라이센스를받는 사람들은 라이센스가 어떤 라이센스인지 알지 못하고 추적해야합니다 (즉, 선의에 있다고 가정).
nyuszika7 시간

3
많은 모듈 (scipy, numpy, matplotlib)에는 __version__메타 데이터가 있지만 프로그램에 액세스하고 대화 형 인터프리터에서 신속하게 확인할 수 있기 때문에 가지고있는 것이 좋습니다. 그러나 저작권 및 법적 정보는 다른 파일에 속합니다. 에 대한 사용 사례가 없다면if 'Rob' in __author__:
endolith

34

위의 답변은 실제로 완전하지만 빠르고 더티 헤더를 복사하여 붙여 넣기하려면 다음을 사용하십시오.

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

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

이것이 좋은 이유는 무엇입니까?

  • 첫 번째 줄은 * nix 사용자를위한 것입니다. 사용자 경로에서 Python 인터프리터를 선택하므로 사용자가 선호하는 인터프리터를 자동으로 선택합니다.
  • 두 번째는 파일 인코딩입니다. 요즘 모든 파일에는 관련 인코딩이 있어야합니다. UTF-8은 모든 곳에서 작동합니다. 레거시 프로젝트는 다른 인코딩을 사용합니다.
  • 그리고 매우 간단한 문서. 여러 줄을 채울 수 있습니다.

참조 : https://www.python.org/dev/peps/pep-0263/

각 파일에 클래스를 작성하면 문서가 필요하지 않습니다 (클래스 doc 내부에 있음).


5
> "현재 모든 파일에는 인코딩이 연결되어 있어야합니다." 오해의 소지가 있습니다. utf8이 기본 인코딩이므로 지정하지 않는 것이 좋습니다.
Jonathan Hartley

23

ASCII가 아닌 문자 집합을 사용하는 경우 PEP 263 도 참조하십시오.

요약

이 PEP는 파이썬 소스 파일의 인코딩을 선언하는 구문을 소개합니다. 그런 다음 주어진 정보를 사용하여 파일을 해석하기 위해 Python 파서에서 인코딩 정보를 사용합니다. 특히 이것은 소스 코드에서 유니 코드 리터럴의 해석을 향상시키고 유니 코드 인식 편집기에서 UTF-8을 사용하여 유니 코드 리터럴을 직접 작성할 수있게합니다.

문제

Python 2.1에서 유니 코드 리터럴은 라틴 -1 기반 인코딩 "unicode-escape"를 사용해서 만 작성할 수 있습니다. 이로 인해 많은 아시아 국가와 같은 비 라틴 -1 지역에서 거주하고 일하는 Python 사용자에게는 프로그래밍 환경이 다소 우호적이지 않습니다. 프로그래머는 선호하는 인코딩을 사용하여 8 비트 문자열을 작성할 수 있지만 유니 코드 리터럴의 경우 "유니 코드 이스케이프"인코딩에 바인딩됩니다.

제안 된 해결책

필자는 파일 상단의 특수 주석을 사용하여 인코딩을 선언하여 소스별로 파일마다 파이썬 소스 코드 인코딩을 표시하고 변경할 수 있도록 제안합니다.

Python이이 인코딩 선언을 인식하게하려면 Python 소스 코드 데이터 처리와 관련하여 많은 개념 변경이 필요합니다.

인코딩 정의

다른 인코딩 힌트가 제공되지 않으면 Python은 기본적으로 표준 인코딩으로 ASCII를 사용합니다.

소스 코드 인코딩을 정의하려면 다음과 같이 매직 주석을 파일의 첫 번째 또는 두 번째 행으로 소스 파일에 배치해야합니다.

      # coding=<encoding name>

또는 (인기있는 편집자가 인식 한 형식 사용)

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

또는

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

...


15
Python 3부터 기본 문자 집합은 UTF-8입니다.
nyuszika7 시간
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.