是否有关于何时停止链接方法的指南,而是将链分解为多个表达式?
考虑例如这个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种方法好吗?通过分割表达式,我会获得任何显着的好处吗?
答案 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
使用,并且在此代码块结束之前不会释放(假设没有对相同的对象进行其他引用)。因此,如果内存紧张,您可能需要考虑链接。
如果内存不是问题,特别是如果稍后可以在代码中再次使用words
或contents
,那么分配变量来引用它们当然会更快,因为{{1不必再次调用},read
和/或lower
方法。