1

プログラムで渡したい情報のほとんどを保持する、Engine という名前のタプルを作成しました。このタプルの内部には、いくつかのパラメーターと、下流のメソッドによって使用される 2 つのインスタンス化されたクラスがあります。

Engine = namedtuple('Engine', 'website, browser, s, e')
engine = Engine(website, browser, s(), e())

download(engine)私は渡す関数を持っていますenginedownloadパス内のサブ関数engine- 一部は使用website、一部は使用browser、一部は使用、一部はs使用e

engineこれで、(プログラマーとしての) 認知オーバーヘッドが大幅に削減され、発生する可能性のある特定の変更の下流と上流の両方で引数リストが最新であることを確認する必要がなくなりました。メソッドで引数を使用しますengine.foo

一方で、これは「怠惰な」プログラミングのように感じます。すべてをエンジンの「クラス」にラップし、変数をクラスのメソッドとして持つだけで、すべてが簡単になりすぎているように思えます。さらに、この実装では見られないある種のオーバーヘッドがあったことを誓います。これには何らかの前例がありますか?無視するには便利すぎると感じているからです。

渡される引数の数を減らすために、プログラム全体で引数の代わりにnamedtuplesを使用する必要がありますか?

4

2 に答える 2

4

これは実はとても良いパターンだと思います。namedtuples非常に効率的で、読みやすさが大幅に向上します。通常のタプルと比較した場合のスペースオーバーヘッドは事実上ゼロです。

したがってnamedtuples、一種の軽量クラスと見なすことができ、責任が増すとクラスに成長する可能性があります。

Raymond Hettingerは、PyCon US 2011からのこのトーク [11:35 - 26:00]で、それらの利点と使用例をかなり詳細に説明しています。これは、私がこれまでにできたよりもはるかに優れています。

于 2012-10-03T20:42:12.670 に答える
4

パラメータ オブジェクト patternの変形のように聞こえます。一方、クラスとしても実装できるように思えます。

class Engine(object):
   website = ...
   browser = ...
   s = ...
   e = ...

   def download(self):
       ...
   def _sub_function(self):
       ...
于 2012-10-03T20:35:58.117 に答える