1

我创建了一个名为 Engine 的命名元组,它包含我想在程序中传递的大部分信息。在这个元组内部,有几个参数和两个实例化的类,它们被下游的方法使用。

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

这听起来像是参数对象模式的一些变体。另一方面,听起来你也可以将它作为一个类来实现,即

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

   def download(self):
       ...
   def _sub_function(self):
       ...
于 2012-10-03T20:35:58.117 回答
4

我想说这实际上是一个非常好的模式。namedtuples非常高效,并且大大提高了可读性。与常规元组相比,它们的空间开销实际上为零。

所以namedtuples可以被看作是一种轻量级的类,如果它们的职责增加,可以成长为它们。

Raymond Hettinger 在这个来自 PyCon US 2011 的演讲 中非常详细地解释了它们的优势和用例,[11:35 - 26:00]比我曾经做过的更好。

于 2012-10-03T20:42:12.670 回答