14

複雑なダックタイプに遭遇するたびに、「このダックタイプ」と言う方法が必要ですが、代わりに「あなたの関数はこの入力のこれを必要としますが、 「それを文書化しないでください」、そしてそれを文書化します。これにより、次のような肥大化した反復的なドキュメントが作成されます。

def Foo(arg):
    """
    Args:
      arg: An object that supports X functionality, and Y functionality,
        and can be passed to Z other functionality.
    """
    # Insert code here.

def Bar(arg):
    """
    Args:
      arg: An object that supports X functionality, and Y functionality,
        and can be passed to Z other functionality.
    """
    # Insert code here.

BazQuxおよびその他の関数についても同様です。arg「 (オブジェクトのタイプ)である」という短い書き方が必要です。

一部のアヒル型では、「辞書のようなオブジェクト」と同じくらい簡単です。辞書に何を期待するかを知っているので、何を渡すかを知っています。、dictまたはそれを模倣できるもの。

テンプレート化された型に関して、C++ にも同じ問題があると思います。Haskell にはそれがありますが、型クラスの定義を使用して文書化できます。(注: Haskell クラス != Java/C++/Python などのクラス) (注: 私は実際には Haskell でプログラミングを行っていないので、下手な例である場合はご容赦ください。)

従来の OO ルートを使用して、基本クラスを作成し、ドキュメントで「この基本クラスのようなもの」と言う必要がありますか? コードは基本クラスからの派生を強制せず (オブジェクトを派生させる必要がないため)、基本クラスはインターフェイスのプロパティを文書化する以外に値を追加しません。

一方、私は Python をプログラミングしており、言語のイディオム内でプログラミングしようとしています。基本クラスは機能を継承するのに適していますが、基本クラスが完全に抽象的である場合、ダックタイプの言語で価値を追加するようには見えません。


編集:答えに:私はアヒルのタイピングが何であるかを知っています(それは投稿から明らかなはずです)。それはどこに文書化すればよいですか、特に質問です。ドキュメントを添付するクラスが存在しない場合。

4

3 に答える 3

8

ダックタイピングの背後にある考え方は、アヒルを期待していることを文書化することであり、アヒルであると偽ることは他のオブジェクト次第です。

ドキュメントのどこにも、StringIOオブジェクトを受け入れることを指定するAPIはありません。ただし、「ファイルのようなオブジェクト」が必要なほとんどの場所で使用できます。

また、ほとんどの場合、標準ライブラリは、ダックタイプに要求される特定のメソッドに名前を付けることを避けようとします。これにより、実装は変更される可能性があります。たとえば、random.sample APIは、反復可能オブジェクトまたはシーケンスの観点から定義できます。

これよりも具体的にしたい場合は、抽象基本クラスを使用できます。いくつかは、コレクションモジュール(Iterable、Hashable、Sizedなど)またはnumbersモジュール(Rational、Integralなど)にすでに含まれています。それらをモデルにして自分で書くのは難しいことではありません。次に、ドキュメントには、必要なABCが記載されています(たとえば、 xサイズ変更された 反復可能で、y積分です)。

于 2011-11-09T02:51:51.293 に答える
1

ダックタイピングのポイントは、「タイプ」の概念が、正式には言語の一部であるものではなく、抽象的な直感的なアイデアになるということです。これにより、タイプチェックが言語の一部である言語よりもはるかに流動的で柔軟なタイピングが可能になります。

ダックタイピングを使用するときに必要なのは、プログラムが使用している「タイプ」を認識していることではなく、他のプログラマーが認識していることです。したがって、特定の「タイプ」のオブジェクトを操作するクラス/関数などのファミリー全体があり、そのタイプを簡単に説明できない場合は、コメントまたはdocstring(またはタイプを記述し、名前を付ける外部.txtファイル)。そうすれば、どこでもその名前を参照できます。

于 2011-11-09T03:01:30.990 に答える
1

Javaのように、より厳密に型指定された言語には、「インターフェース」の概念があります。これは、インターフェースを実装するクラスが提供することになっているメソッドのコレクションです。

厳密な型指定の手荷物を必ずしも持ち込むことなく、概念を借用できると思います。抽象クラスを定義して文書化し、メソッドが「aまたはaのようなオブジェクト」Fooを期待していると言います。必要がなければ、他のクラスを実際に継承させる必要はありません。ドキュメントを読んでいる人は、似たようなオブジェクトに何が期待されているかを知るためにどこに行けばよいかをまだ知っています。FooFooFooFoo

于 2011-11-09T03:05:21.677 に答える