3

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

考虑一下这个 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 种方法可以吗?通过拆分表达式,我会获得任何明显的好处吗?

4

3 回答 3

6

只链接两个有什么意义?如果你做方法链,做对了。

这更多是格式问题,如果单行内容太多,我更喜欢

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

另一个问题可能是调试器,Foo如果您想跟踪到Bar.

于 2010-12-28T14:22:43.750 回答
4

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

如果你确信不会发生异常,那么

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可以稍后在代码中再次使用,那么分配一个变量来引用它们当然会更快,因为不必再次调用read,lower和/或方法。split

于 2010-12-28T15:11:39.353 回答
4

这在很大程度上取决于个人喜好,但如果 f 中的文本不会在其他地方使用,那也没关系。对于普通读者来说,链实际上返回什么变得不清楚的点是它太长的点。拆分它的唯一好处是您可以使用中间结果并且您可以获得清晰性。

于 2010-12-28T14:24:20.380 回答