【发布时间】:2020-12-13 16:17:33
【问题描述】:
我有一个非常大的项目,我需要将一些模块从 bar 移动到 foo.bar,然后更新所有函数调用以反映新位置。
这对函数调用很有效,但我在构建匹配装饰器的模式时遇到问题。
我喜欢匹配的代码是::
from unittest.mock import patch
@patch('bar')
def func(self, patcher):
...
我想把上面的补丁改成@patch('foo.bar')。
我当前的模式在函数调用时匹配patch,但在用作装饰器时不匹配::
class FixRenameMockPatch(fixer_base.BaseFix):
PATTERN = """
power<
'patch' args=trailer< '(' [any] ')' >
>
"""
def transform(self, node, results):
...
我真的很难理解https://docs.python.org/3.8/reference/grammar.html 的语法,所以我的修复程序主要基于lib2to3 的源代码。
如何编写上面的模式以匹配patch 的所有用途,包括装饰器和上下文管理器?以及一个完全合格的补丁使用,例如mock.patch或unittest.mock.patch?
【问题讨论】: