我想了解这行代码:
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。
答案 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
调用该函数时,它将匹配对象作为参数传递,因此代码工作正常。