【问题标题】:Method chaining - how many chained methods are enough?方法链 - 多少链方法就足够了?
【发布时间】:2010-12-28 14:17:24
【问题描述】:

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

考虑例如这段 Python 代码,它构建了一个字典,以 word 为 key,相应的 count 为 value:

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

【问题讨论】:

  • 吹毛求疵。不要分配给隐藏内置的dict。也许将其重命名为 word_count 并将函数重命名为 count_words。我认为您链接的三种方法没有任何问题。我一眼就能看出你在做什么。

标签: python coding-style method-chaining


【解决方案1】:

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

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

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

另一个问题可能是调试器,如果你想跟踪到Bar,它会强制你跟踪到Foo

【讨论】:

  • 天啊!你当然是对的。在 python 中工作的长链有什么替代方案吗? (我对 python 的唯一经验是摆弄构建脚本并希望我不会破坏太多)
  • 在整个表达式周围加上括号就可以了。
【解决方案2】:

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

【讨论】:

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

    【讨论】:

    • 我认为内存不是问题,因为标准实现是引用计数的
    • 是的,但是当它们被更改时范围会更小,并且 gc 可以更快地清除对象。
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 2023-04-11
    • 2010-12-15
    • 2010-11-04
    • 2015-05-16
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多