Lambda函数似乎从re模块继承方法

时间:2015-08-26 06:04:03

标签: python lambda

我想了解这行代码:

s, n = re.subn('{([^{}]*)}',
               lambda m: random.choice(m.group(1).split("|")),
               s)

这是功能:

def spin(self, s):
    while True:
        s, n = re.subn('{([^{}]*)}',
                       lambda m: random.choice(m.group(1).split("|")),
                       s)
        if n == 0: break
    return s.strip()

该程序正在导入re模块,似乎m继承了re的方法。那个怎么样? Lambdas应该只是无名的功能。

源代码中没有任何地方re被实例化。换句话说,我没有看到有一个名称为m的对象在哪里。只有函数lambda中的spin()

我做了很多谷歌搜索;但没有解释这个神秘的代码行。

整个计划是here

2 个答案:

答案 0 :(得分:1)

该函数正在传递匹配对象,该对象具有group,依此类推。它不是“继承”任何东西。它只是传递了一个对象。 m是表示传递的对象的参数的名称。以下是等效的:

func = lambda x: x**2

def func(x):
    return x**2

另一个例子:

f2 = lambda m: m.upper()

def f2(m):
    return m.upper()

上例中的m没有从字符串“继承”。它只是指向该函数传递(或预期传递)的字符串对象。

答案 1 :(得分:1)

Lambda函数不会继承任何东西。

documentation of re.sub(类似于re.subn) -

中可以看出
  

re.sub(pattern,repl,string,count = 0,flags = 0)

     

...
  如果repl是一个函数,则会针对模式的每个非重叠事件调用它。该函数接受一个匹配对象参数,并返回替换字符串。
  ...

(强调我的)。

在你的情况下,lambda函数接受一个m的参数,然后你在lambda函数的主体中使用m的方法。

你的lambda函数类似于 -

def func(m):
    return random.choice(m.group(1).split("|"))

re.subn调用该函数时,它将匹配对象作为参数传递,因此代码工作正常。