2014-12-10 5 views
3

epydoc 및 Sphinx 문서 생성기는 모두 형식이 any/all 함수 매개 변수 중 무엇이어야하는지 주석을 달 수 있습니다.python 함수를 강제로 docstring에서 매개 변수 유형

내 질문은 : 거기가 문서화 문자열에을 문서화 할 때 은 (실행시) 이러한 유형을 적용하는 방식 (또는 모듈)입니다. 이것은 강력한 형식의 (컴파일 타임 검사)이 아니지만 회사 유형 (런타임 검사)이라고 할 수 있습니다. 어쩌면 "SemanticError"

가 이상적으로 이미 xkcd에 따라, "import antigravity"모듈과 유사한 (모듈 같은) 뭔가가있을 것이고,이 "firm_type_check"을 제기 ... 더 나은 여전히 ​​"ValueError를"을 제기하거나, 모듈은 이미 다운로드 할 수있는 곳에 존재합니다. FYI

다음과 같이 epydoc 및 sphinz 대한 참조 문은 :

epydoc: 함수 및 메소드 파라미터 :

  • 파라미터 : P : ... # 함수의 매개 변수 (P)의 설명 또는 방법.
  • @type p : ... # 매개 변수 p의 예상 유형입니다.
  • @return : ... # 함수 또는 메서드의 반환 값입니다.
  • @rtype : ... # 함수 또는 메서드의 반환 값 유형입니다.
  • @keyword p : ... # 키워드 매개 변수 p에 대한 설명.
  • @raise e : ... # 함수 또는 메서드가 적용되는 상황에 대한 설명 예외가 발생합니다. e. 이 필드

Sphinx: 내부 파이썬 객체 기술 지침, 나머지 필드 목록 인정 멋지게 포맷 :

  • PARAM, 매개 변수, 인수, 인수, 키, 키워드 : 매개 변수의 설명.
  • 유형 : 매개 변수의 유형.
  • raises, raise, except, exception : 예외가 발생하면 예외가 발생합니다.
  • var, ivar, cvar : 변수에 대한 설명입니다.
  • 반환 값, 반환 값 : 반환 값에 대한 설명.
  • rtype : 반환 형식입니다.

귀도가 언급 한 내용은 mail.python.org이고의 Jukka Lehtosalo가 작성한 것입니다. CMIIW : mypy를 py3 모듈로 가져올 수 없습니다.문서화 문자열을 사용하지 않는 것이

유사 유래 질문 자체 : 제가 알기로

+1

docstrings에서는 읽을 수 없지만 https://pypi.python.org/pypi/typedecorator는 데코레이터로 유형을 적용하는 좋은 방법입니다. 또한 Python 3 주석 (아래 http://stackoverflow.com/a/27402144/363836에서 제안)을 사용하여 지원합니다. – jwmullally

+1

Python> 3.5의 경우 : https : //www.python.org/dev/peps/pep-0484/ – ederag

답변

1

이 종류의 아무것도 몇 가지를 들어, 존재하지 않는 중요한 이유 :

  • 먼저 docstrings은 주석과 마찬가지로 문서입니다. 그리고 주석처럼 사람들은 프로그램이 작동하는 방식에 아무런 영향을 미치지 않을 것이라고 기대할 것입니다. 프로그램의 동작을 문서에 의존하게하는 것은 중요한 반 패턴이며 모든 경우에 끔찍한 생각입니다.

  • 두 번째로, 문서 문자열은 보존되지 않을 수도 있습니다. 예를 들어 python-OO으로 실행하면 모든 docstring이 제거됩니다. 그 때 무엇?

  • 마지막으로 Python 3에는 그 기능을 훨씬 향상시키는 선택적 기능 주석이 도입되었습니다. http://legacy.python.org/dev/peps/pep-3107/. 파이썬은 현재 그것들과 아무런 관련이 없습니다 (그것들은 문서 임). 그러나 만약 내가 그러한 모듈을 작성한다면, 나는 그것을 사용하고 문서화 문자열은 사용하지 않을 것입니다.

내 솔직한 의견은 이것이다 : 당신이 거라면 파이썬에 대한 (반드시 반 구운) 정적 타입 시스템을 작성하는 (상당한) 문제를 통해 이동, 모든 시간은 당신이 넣어 될 것이다 걸릴 것입니다 덜 미친 방법으로 정적 형식을 지원하는 다른 프로그래밍 언어 학습에 의해 더 나은 사용 :

  • Clojure의을 (http://clojure.org/)는 (때문에 리스프 등의 특성으로) 매우 역동적이고 강력하고 core.typed을 통해 옵션 정적 타이핑을 지원합니다 (https://github.com/clojure/core.typed). 동시성과 네트워킹 (STM과 지속적인 데이터 구조를 가지고 있습니다. < 3)은 훌륭한 커뮤니티를 가지고 있으며 내가 본 가장 우아하게 디자인 된 언어 중 하나입니다. 즉, JVM에서 실행됩니다. JVM은 좋은 점과 나쁜 점 모두입니다.

  • Golang (http://golang.org/)은 일종의 Python (또는 적어도 Python에서 많은 피난민을 끌어 들이고 있습니다.)을 느껴 정적으로 입력하고 원시 코드로 컴파일합니다.

  • 녹슬림 (http://www.rust-lang.org/)은 그보다 낮은 수준이지만 형식 유추, 패턴 일치, 특성, 제네릭, 제로 크기 형식 등 가장 우수한 형식 시스템 중 하나를 가지고 있으며 적용합니다 메모리 및 리소스 안전 (컴파일시) 그것은 다음 브라우저 (서보)를 쓰는 언어로서 모질라에 의해 개발되고 있습니다. 그래서 성능과 안전이 주요 목적입니다. 당신은 C++에 대한 현대적인 생각이라고 생각할 수 있습니다. 원시 코드로 컴파일되지만 아직 1.0에 도달하지는 않았으므로 언어 ​​자체는 여전히 변경 될 수 있습니다. 그래서 아직 생산 코드를 작성하지 않는 것이 좋습니다.

+0

TBH : 단위 테스트를 향상시키는 방법을 찾고 있습니다 ... 그래서 최적화 옵션 "-OO"에 대한 필요성은 없습니다. 이상적으로는 프로덕션 코드에서 "끄기"만 할 수 있습니다. – NevilleDNZ

+0

** 또한 ** 문서 구조 문서가 정확하고 최신인지 확인합니다. – NevilleDNZ

+0

또 다른 중요한 고려 사항은 오리 타이핑입니다. 파이썬 생태계의 * lot *은 의존합니다 : 예를 들어,'file' 매개 변수를 사용하는 대부분의 함수는'StringIO' 또는'urllib.urlopen' 오브젝트로 대신 잘 작동하고 잔인합니다 typechecking 그 힘의 대부분에서 당신을 잘라 버릴 것이다. 추상 기본 클래스는 필요성을 어느 정도 완화 할 수 있지만 완벽하지는 않습니다. –