partial
in python with 0 comment

partial

in python with 0 comment

从一个简单的需求说起

如果存在这样的需求:我们希望某个函数(多个参数)传入一个参数,过一段时间后再去传入另外的参数。

这种需求经常可以在 Scrapy 中的 callback 中出现:比如在抓取某些规整的网页内容时(如http://sn.people.com.cn/GB/190197/190210/index.html ) ,我们已经可以很轻松的在列表页内获得每条新闻的URL和标题。在新闻页中,我们也可以很轻松的获得内容和标题。在一定情况下我们希望每个函数只做一件事,这使得 parse 函数只会解析 URL 。但假如新闻页面中的标题元素十分难以定位,这时就可以选择 partial 来进行参数的传递。

从一个简单的例子说起

from functools import partial


def add(a, b):
    return a + b


partial_a = partial(add, 1)
partial_a(2)

在声明 add 函数之后对其第一个参数 a 进行了预先传值,得到已经获得参数的函数 partial_a 。这时 partial_a 类似于 add(a=1, b) 。所以对其传入第二个参数 b 即可获得结果。

可以使用 dis 来查看上面的代码是如何运行的:

python -m dis test.py
  1           0 LOAD_CONST               0 (0)
              2 LOAD_CONST               1 (('partial',))
              4 IMPORT_NAME              0 (functools)
              6 IMPORT_FROM              1 (partial)
              8 STORE_NAME               1 (partial)
             10 POP_TOP

  4          12 LOAD_CONST               2 (<code object add at 0x0000023E946D3150, file "test.py", line 4>)
             14 LOAD_CONST               3 ('add')
             16 MAKE_FUNCTION            0
             18 STORE_NAME               2 (add)

  8          20 LOAD_NAME                1 (partial)
             22 LOAD_NAME                2 (add)
             24 LOAD_CONST               4 (1)
             26 CALL_FUNCTION            2
             28 STORE_NAME               3 (partial_a)

  9          30 LOAD_NAME                3 (partial_a)
             32 LOAD_CONST               5 (2)
             34 CALL_FUNCTION            1
             36 POP_TOP
             38 LOAD_CONST               6 (None)
             40 RETURN_VALUE
Responses