方法链 - 有多少链式方法就足够了?

时间:2010-12-28 14:17:24

标签: python coding-style method-chaining

是否有关于何时停止链接方法的指南,而是将链分解为多个表达式?

考虑例如这个Python代码,它构建一个字典,用word作为键,相应的计数作为值:

def build_dict(filename):
    with open(filename, 'r') as f:
        dict = defaultdict(int)

        for word in f.read().lower().split(): # too much?
            dict[word] += 1

        return dict

链接3种方法好吗?通过分割表达式,我会获得任何显着的好处吗?

3 个答案:

答案 0 :(得分:6)

链接只有两个是什么意思? 如果你做方法链接,那就做吧。

这更像是一个格式化的问题,如果它对单行来说很多,我更喜欢

(x.Foo()
  .Bar()
  .FooBar()
  .Barf());

另一个问题可能是调试器,如果要跟踪Foo,则会强制您追踪到Bar

答案 1 :(得分:3)

这在很大程度上取决于个人偏好,但如果f中的文字不会在其他地方使用,那就没问题了。对于一个不经意的读者来说,链条实际上返回的内容变得不清楚的地方就是它太久了。拆分它的唯一好处是你可以使用中间结果,你可以获得清晰度。

答案 2 :(得分:3)

不使用长链的一个原因是它掩盖了回溯错误消息。 当在长链中的任何地方引发异常时,回溯错误消息仅告诉您发生异常的行,而不是链的哪个部分。

如果您确信不会发生任何例外,那么

for word in f.read().lower().split():
    dict[word] += 1

可能比

更可取
contents=f.read()
contents=contents.lower()
words=contents.split()
for word in words:
    d[word] += 1

因为内存由字符串contents和列表words使用,并且在此代码块结束之前不会释放(假设没有对相同的对象进行其他引用)。因此,如果内存紧张,您可能需要考虑链接。

如果内存不是问题,特别是如果稍后可以在代码中再次使用wordscontents,那么分配变量来引用它们当然会更快,因为{{1不必再次调用},read和/或lower方法。