問題タブ [duck-typing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - ダックタイピング: 名前の衝突を避けるには?
ダックタイピングの考え方は理解できたので、コードでもっと頻繁に使用したいと思います。ただし、潜在的な問題が 1 つあります。名前の衝突です。
オブジェクトに何かをさせたいとします。適切なメソッドを知っているので、それを呼び出して何が起こるかを確認するだけです。一般に、次の 3 つの結果が考えられます。
メソッドが見つからず、
AttributeError
例外が発生します。これは、オブジェクトが私が思っているものではないことを示しています。ダックタイピングを使用すると、そのような例外をキャッチするか、外側のスコープにそれを処理させる (またはプログラムを終了させる) ことをいとわないので、それは問題ありません。メソッドが見つかり、まさに私が望んでいることを実行し、すべてが素晴らしいです。
メソッドは見つかりましたが、必要なメソッドではありません。これは、まったく無関係なクラスの同じ名前のメソッドです。矛盾した状態が後で検出されるか、最悪の場合、プログラムが暗黙のうちに誤った出力を生成するまで、実行が続行されます。
これで、質の高い名前が結果 #3 の可能性をいかに減らすことができるかがわかります。しかし、プロジェクトが結合され、コードが再利用され、ライブラリが交換され、ある時点で 2 つのメソッドが同じ名前を持ち、完全に無関係である可能性が非常に高くなります (つまり、ポリモーフィズムで互いに置き換えられることを意図していません)。
私が考えていた解決策の 1 つは、メソッド名のレジストリを追加することです。各レジストリ レコードには、次のものが含まれます。
- メソッド名 (一意、つまり、名前ごとに 1 つのレコードのみ)
- その一般化された説明 (つまり、それが呼び出される可能性のあるすべてのインスタンスに適用可能)
- 使用する予定のクラスのセット
メソッドが新しいクラスに追加された場合、そのクラスを (手動で) レジストリに追加する必要があります。その時点で、プログラマーはおそらくメソッドが既に付けられている意味と一致していないことに気付き、必要に応じて別の名前を使用します。
メソッドが呼び出されるたびに、プログラムは名前がレジストリにあり、インスタンスのクラスがレコード内のクラスの 1 つであることを自動的に確認します。そうでない場合は、例外が発生します。
これが非常に難しいアプローチであることは理解していますが、精度が重要な場合には、役立つ可能性があることがわかります。(Python またはその他の動的型付け言語で) 試しましたか? 似たようなことをするツールはありますか?検討する価値のある他のアプローチはありますか?
注: 名前空間の汚染を回避することが正しいアプローチであるグローバル レベルでの名前の競合については言及していません。メソッド名の衝突について言及しています。これらは名前空間の影響を受けません。
python - Python 3.1 でダック タイピングを使用して注文するための最小限の方法
マニュアルには次のように書かれています。
一般に
__lt__()
、__eq__()
比較演算子の従来の意味が必要な場合は、これで十分です
しかし、私はエラーが表示されます:
このテストを実行すると:
IntVar()
右側にある when が__int__()
呼び出されていないことに驚いています。私は何を間違っていますか?
追加__gt__()
するとこれは修正されますが、注文の最小要件が何であるかを理解していないことを意味します...
ありがとう、アンドリュー
ruby - 配列のサブクラスでto_aとto_aryの動作が異なるのはなぜですか?
ArrayのサブクラスXがある場合、doingX#to_a
は配列オブジェクトをX#to_ary
返し、doingはxオブジェクトを返します。
それto_a
は「配列に変更できる」という意味であり、「to_ary
配列のように振る舞う」という意味では理解できますが、前者がクラスの変更を実装し、後者が実装しない理由がわかりません。
to_a
また、リスコフの置換原則の下で、配列のサブクラスを返すのに十分ではありませんか?
python - ダックタイピングとクラスメソッド (または、クラスとインスタンスの両方からメソッドを使用する方法?)
インスタンスまたはクラスを交換可能に渡したいコードがいくつかあります。そのコードで行うことは、クラスとインスタンスの両方にあると思われるメソッド (go()
以下の例のメソッド) を呼び出すことだけです。
残念ながら、通常のメソッドと同じ名前のクラスメソッドを作成することはできません...以下の例を参照してください。最初は、2 番目の呼び出しでa
ではなく が生成されると予想していましたb
。
これを達成する方法について何かアドバイスはありますか?
c#-4.0 - ImpromptuInterface を使用する場合、この enum キャストの問題を解決するにはどうすればよいですか?
次のコードがあるとします。
次のテストは失敗します。
この問題を適切に解決する方法はありますか?
programming-languages - 関数型プログラミングと強力な型付けの間に何らかの関連はありますか?
「純粋な」関数型言語はすべて強い型付けです。それらの間にリンクはありますか?
c++ - C++でのダックタイピングのテンプレート
テンプレートタイプにプロパティを要求する方法はありますか?
例えば:
では、特定のタイプを返す定義済みT
のをどのように要求しますか?operator()(U a, U b)
これは可能ですか?(私はそれがdにあることを知っていますが、c ++についてはよくわかりません)。
ps。ここでダックタイピングが間違っている場合は、私に知らせてください。それは正しいと思いますが、よくわかりません。
ruby - Rubyの「is_a?」組み込み型に対して false を返していますが、何が起こっていますか?
私は Ruby の深い部分を数か月しか学んでいないので、これが少しばかげた質問だったら申し訳ありません。ネストされた配列を含む可能性のある配列を再帰的に反復しようとしているため、現在の要素の型を確認する必要があります。小さなテストとして次のコードがあります。
実行すると、次の出力が得られます。
Range と 2 つのネストされた Array を含む Array があるので、最後の 2 つは True を返すと予想していました。
さらに奇妙なのは、次のように書く場合です。
当然のことながら、True を返します。
ここで何が起こっているのですか?
Ruby バージョン: MRI 1.9.3-p194
注:最終的に、コードの衝突を回避するためにモジュールを使用してコードに名前を付ける方法が原因で、これが発生していることに気付きました。
これを行うと、コードが分離されますが、名前空間の下から始まるすべてのクラス ルックアップが解決されるという欠点があります。これは、上記の例でmy_array.class
は、実際MyProg::Array
にはグローバル Array クラスの代わりに解決されることを意味します。
このような名前空間を使用していて、それでもこのメソッドを使用したい場合は、クラスの前にダブルコロンのグローバル識別子を使用して、Ruby にグローバル名前空間からのルックアップを強制的に開始させることで、問題を解決できます。
ただし、Ruby の Duck Typing 機能を考えると (そして、後でコードをより適切に保守するために)、以下の Peter の提案に従って、実際にオブジェクトの動作をテストする必要があります。そのため、学習者に与えられたいくつかの優れたヘルプに対して、彼の答えを正しいものとしてマークしています!
python - ダックタイピングを適切に組み込んで元のタイプに戻すにはどうすればよいですか?
これが重複していないことを本当に願っています。質問を検索しようとしましたが、見つかりませんでした。
だから私はフィートをメートルに変換するかなり単純な関数を持っています:
これはうまく機能し、int、float、array、およびlistを受け入れます。ただし、(numpy配列ではなく)リストを作成する場合は、リストを返したいのですが。だから私はこれを書いた:
(または、ここでreturn list(numpy.array(val) * 0.3084)
使用したい場合は最後の行に使用できますがnumpy
、それが本当に重要かどうかはわかりません。)
type
これは、関数の使用を回避できるように、ここにダックタイピングを組み込むための最良の方法ですか?もともと試しAttributeError
ましたが、うまくいきませんでした。それでも、うまくいくように見えても、私はうんざりしTypeError
ています。
if type(val) is list
代わりに使用するのは犠牲になりますか?
python - python ダックタイピングで2つの類似オブジェクトを比較
私の設計は完全に狂っているかもしれませんが、比較可能な2つの派生クラスオブジェクトがある場合、クラスD1は基本的に常に>クラスD2になります。(Ivy Bridge と 286 を比較するとします)。isinstance(D2) を使用せずにクラス D1 の比較を実装してそれを反映するにはどうすればよいですか?
私はこれを見ました: Comparing two objects と Python でのダックタイピングの場合、isinstance をテストする必要がありますか?
「type」属性を追加してタイプを比較することもできますが、その場合は isinstance を使用することもできます。最も簡単な方法は isinstance を使用することです...もっと良い提案はありますか?