如何将两个变量传递给我的替换函数?
我已将其定义为
def replace(line,suppress)
这样称呼它:
line = re.sub(r'''(?x)
([\\]*\$\*)|
([\\]*\$\{[0-9]+\})|
([\\]*\$[0-9]+)|
([\\]*\$\{[a-zA-Z0-9_]+\-.*\})|
([\\]*\$\{[a-zA-Z0-9_]+\=.*\})|
([\\]*\$[a-zA-Z0-9_]+)|
([\\]*\$\{[a-zA-Z0-9_]+\})|
([\\]*\$[\{]+.*)
''',replace,line,suppress)
收到错误:
return _compile(pattern, flags).sub(repl, string, count)
TypeError: replace() takes exactly 2 arguments (1 given)
答案 0 :(得分:3)
正如已经提到的,当re.sub
调用你的函数时,它只传递一个参数。 docs表示这是一个匹配对象(可能是line
变量?)
如果要传递其他参数,则应将函数包装在lambda表达式中。
类似于:
re.sub('...', lambda line: replace(line, suppress))
或
re.sub('...', lambda line, suppress=suppress: replace(line, suppress))
请注意在第二个suppress=suppress
的签名中使用lambda
。这是为了确保suppress
的值在suppress
定义时lambda
的值。没有它,suppress
的值是执行函数时suppress
的值。在这种情况下,它实际上并不重要(因为lambda在定义之后立即使用,所以suppress
永远不会在定义和执行之间改变),但我认为你理解它是多么重要lambda
适用于将来使用它。
答案 1 :(得分:0)
Re.sub
只接受其repl
参数的函数,该参数取一个值。这是在Re.sub
的实现中定义的。您无权访问它。