4

私の質問はPythonに向けられていますが、JavaScriptやその他のスクリプト言語に関するものでもあります。動的型指定言語で関数の引数を記述する方法は?

私は通常、静的型付けされた言語(Java、C++、ActionScriptなど)で開発しています。

私は時々Pythonを使うのが好きで、JavaScriptを使う必要があることもあります。これらは動的型付き言語です。それには何も問題はありませんが、私は通常、関数やメソッドにどのパラメータが必要であるかを理解するために頭痛があります。たとえそれが私自身のコードであってもdocstringを使っていても起こります!多分、目は機能の定義以外の場所を見なければならないからです。

もちろん答えはドキュメントに記載されています。しかし、時にはそれはまったく明らかではないか、またはダックの入力のために文書化自体が難しいかもしれない( "最初のパラメータは、quack()メソッドとfeathers(arg)メソッドを持たなければならない関数です。 argは文字列 "です)。私が非常に好きなのは、たとえActionScriptのようなオプションであっても、言語そのものの中で一種の議論記述です。

関数/メソッドの引数を曖昧さなく記述するためのベストプラクティスは何ですか?

特別なデコレータ(Pythonを使用している場合)を作成する目的は、使用時にデータのタイプをチェックすることです(しかし、実行時ではなく書き込み時に使用されるため、 )?

あなたはそれが問題ではないと思いますか?現在のdocstring以上のことは、開発者を混乱させるか、私の心はスタティック型すぎるのか?

+0

は、このようなデコレータを忘れる:それとも、あなたは「Duck様」のインターフェイスを文書化することが重要だ場合、私はそれが参考文書として役立つ基本クラスを宣言することが分かってきました。ドキュメンテーションには役に立たず、非常に複雑で(適切に実行されていれば)、オーバーヘッドが大きく、ダックタイピングを危険にさらし、タイプチェックの通常のメリット(プログラムを実行しないでチェックすること、前述のドキュメント、最適化など) )。あなたは* "静的すぎるタイプの指向" *です。 – delnan

+0

多分それは確かです:)しかし、私は時には、私が何を与えなければならないかを知るために、いくつかのPythonライブラリのドキュメントを理解するのに時間を費やすという印象を持っています。私は静的な型付けを使って関数/メソッドのシグネチャを調べるだけです。私は動的な型定義が静的型付き言語のいくつかの制限を打ち破ることができることを知っていますが、ライブラリの使用の不明確な理解を意味するならば、私は時間を失うと感じます。 –

答えて

2

私はJavascriptを知りませんが、Pythonは次のようになり、バージョン3、以降のオプションfunction annotationsがあります

def haul(item: Haulable, *vargs: PackAnimal) -> Distance: 

か:

def compile(source: "something compilable", 
      filename: "where the compilable thing comes from", 
      mode: "is this a single statement or a suite?"): 

詳細についてはthe PEPを参照してください。

実行時にアクセスでき、type checkingでも使用できます。

+0

私はOPが彼が書くべき場所を示唆しながら、彼が使うはずの文章のスタイルについて質問していると信じています。 –

+0

彼は「特別なデコレータ(Pythonを使用している場合)を作成すると、使用するデータのタイプをチェックすることができます(ただし、実行時ではなく書き込み時に使用されるため、 )? " - 関数の注釈は両方のユースケースに役立つので、その質問を解決します。 – ch3ka

+0

ああ、あなたは正しいです - 私の欠けている部分を許してください。 –

0

なぜダックタイピングがドキュメントを書きにくくするのですか?

関数を書くときは、引数が特定の型のものであると仮定して書くか、特定のインタフェースに確認する...だから、それだけを書いてください。たとえば、あなたがswim_in_pond(duck)メソッドを持っている場合は、「duckquack()swim()、およびdive()メソッドを持つことが期待されている」文書化する必要はありません

を - ほとんどの場合、それは、duckDuckのインスタンスである」と言って完全に十分です"

class DuckBase(object): 
    def quack(self): 
     """ Makes the duck quack. """ 

    def swim(self): 
     """ Swims around. 
      Assumes the duck is already in water. 
      Updates the duck's position. """ 

    def dive(self): 
     """ Dives either as deep as possible (either until the duck runs out of 
      air, or it hits the bottom of the pond). """ 
+0

それは実際にアヒルタイピングですか? –

+0

@ DanRoberts 'swim_in_pond'がその(紛失、非公式に定義された)インターフェースを持つオブジェクトを受け入れるなら、それはです。 – delnan

関連する問題