-1

我在 github 上的大公司的开源项目中看到,他们以尽可能小的步骤完成简单的程序。

他们试图通过使用高级方法来最小化代码行数,这使得即使是简单的函数调用也显得复杂。

我怎么能理解这些东西。它不是关于高级概念,而是以有效的方式做简单的事情,这使得代码看起来难以理解。

例如,这是来自 scrapy 的 crawlerSpider 的代码

def identity(x):
    return x

class Rule(object):

    def __init__(self, link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=identity):
        self.link_extractor = link_extractor
        self.callback = callback
        self.cb_kwargs = cb_kwargs or {}
        self.process_links = process_links
        self.process_request = process_request
        if follow is None:
            self.follow = False if callback else True
        else:
            self.follow = follow

这是他们使用规则的地方

rules = ()
for link in links:
                r = Request(url=link.url, callback=self._response_downloaded)
                r.meta.update(rule=n, link_text=link.text)
                yield rule.process_request(r)

现在我无法理解identity function它什么都不做有什么用

所以process_request = identity这意味着

rule.process_request(r) = identity(r) whcihr基本上返回该行等于

yield r. 为什么他不能写那条简单的线而不是身份。

像这样的事情还有很多,我无法理解。

是否有任何书可以解释以这种方式编写程序。我不喜欢一章一章地从数据类型开始的书,最后我仍然看不到像我们在 github 上那样的单个程序。

4

1 回答 1

3

身份函数是一种技术性,它可以让您将数据通过一个过程,当您真的不想要一个转换时,该过程期望转换。

例如,如果您有一个函数需要一个数组和另一个函数映射到数组上,但您不想要映射(但该函数所做的所有其他事情),那么您将其传递给身份函数。

这种模式在支持高阶抽象的语言中很常见,尤其是函数式语言。它不仅限于 Python。

于 2012-12-17T22:24:46.827 回答