4

epydoc と Sphinx の両方のドキュメント ジェネレーターを使用すると、コーダーは任意/すべての関数パラメーターの型に注釈を付けることができます。

私の質問は: docstringに文書化されているときに、これらの型を (実行時に)強制する方法 (またはモジュール) はありますか? これは厳密な型付け(コンパイル時チェック) ではありませんが、(より可能性が高い)厳密な型付け(実行時チェック) と呼ばれる可能性があります。たぶん「ValueError」を発生させるか、さらに良いことに...「SemanticError」を発生させます

理想的には、 xkcdimport antigravityによる " " モジュールに似たもの (モジュールのようなもの)がすでに存在し、この "firm_type_check" モジュールは、ダウンロードできる便利な場所に既に存在しているはずです。

参考: epydoc と sphinz のドキュメント文字列は次のとおりです。

epydoc: 関数とメソッドのパラメーター:

  • @param p: ... # 関数またはメソッドのパラメーター p の説明。
  • @type p: ... # パラメータ p の予想される型。
  • @return: ... # 関数またはメソッドの戻り値。
  • @rtype: ... # 関数またはメソッドの戻り値の型。
  • @keyword p: ... # キーワード パラメータ p の説明。
  • @raise e: ... # 関数またはメソッドが例外 e を発生させる状況の説明。

Sphinx: Python オブジェクト記述ディレクティブ内で、これらのフィールドを含む reST フィールド リストが認識され、適切にフォーマットされます。

  • param、parameter、arg、argument、key、keyword: パラメータの説明。
  • type: パラメータのタイプ。
  • raises、raise、except、exception: 特定の例外が発生したとき (および発生したとき)。
  • var、ivar、cvar: 変数の説明。
  • return, return: 戻り値の説明。
  • rtype: 戻り型。

私が見つけた最も近いものは、mail.python.org で Guido によって言及され、Mypy Examplesで Jukka Lehtosalo によって作成されたものでした。 CMIIW : mypy は py3 モジュールとしてインポートできません。

docstring自体を使用しない同様のスタックオーバーフローの質問:

4

1 に答える 1

1

私の知る限り、いくつかの重要な理由から、そのようなものは存在しません。

  • まず、docstring はコメントと同様にドキュメントです。コメントと同じように、人々はコメントがプログラムの動作に影響を与えないことを期待します。プログラムの動作をそのドキュメントに依存させることは、主要なアンチパターンであり、恐ろしい考えです。

  • 第 2 に、docstring が保持される保証はありません。たとえば、で実行するpython-OO、すべての docstring が削除されます。じゃあ何?

  • 最後に、Python 3 ではオプションの関数アノテーションが導入されました。これは、その目的をよりよく果たすでしょう: http://legacy.python.org/dev/peps/pep-3107/。Python は現在、それらを使って何もしません (それらはドキュメントです) が、私がそのようなモジュールを書くとしたら、docstring ではなくそれらを使用します。

私の正直な意見は次のとおりです。Python 用の (必然的に中途半端な) 静的型システムを作成するという (かなりの) トラブルを経験する場合は、別のプログラミングを学ぶことで、より有効に活用できるようになるでしょう。狂気の少ない方法で静的型付けをサポートする言語:

  • Clojure ( http://clojure.org/ ) は信じられないほど動的で強力であり (Lisp としての性質により)、オプションの静的型付けcore.typed( https://github.com/clojure/core.typed ) をサポートしています。並行性とネットワーキング (STM と永続的なデータ構造 <3 を備えています) を対象としており、優れたコミュニティがあり、私が見た中で最もエレガントに設計された言語の 1 つです。とはいえ、JVM で実行されることは、良いことでもあり悪いことでもあります。

  • Golang ( http://golang.org/ ) は一種の Pythonic のように感じられ (少なくとも、Python から多くの難民を惹きつけています)、静的に型付けされ、ネイティブ コードにコンパイルされます。

  • Rust ( http://www.rust-lang.org/ ) はそれよりも低レベルですが、私が見た中で最も優れた型システムの 1 つ (型推論、パターン マッチング、特性、ジェネリック、サイズがゼロの型) を備えています。 ...)コンパイル時にメモリとリソースの安全性を強化します。Mozilla が次期ブラウザ (サーボ) を記述するための言語として開発しているため、パフォーマンスと安全性が主な目標です。これは、C++ を現代的に解釈したものと考えることができます。ネイティブ コードにコンパイルされますが、まだ 1.0 に達していないため、言語自体はまだ変更される可能性があります。そのため、まだプロダクション コードを書くことはお勧めしません。

于 2014-12-10T13:23:36.740 に答える