语法软件搜索和替换工具。
refex的Python项目详细描述
Refex-重构表达式
Refex是一个语法感知的Python搜索和替换工具,它允许您使用模板或 更复杂 Clang-LibASTMatcher-类 匹配器接口。在
示例
自动插入括号:Refex将自动插入括号 要保留预期的代码结构:
$ echo"a = b.foo() * c" > test.py $ refex --mode=py.expr '$x.foo()' --sub='$x.foo() + 1' -i test.py ... $ cat test.py a=(b.foo() + 1) * c
天真的正则表达式替换会导致b.foo() + 1 * c
,但事实并非如此
相当,与预期更换无关。在
成对括号:Refex知道完整的语法树,并将始终正确匹配括号:
^{pr2}$在这里,使用正则表达式进行天真的替换可能会导致
print(foo(bar(b)) + 1)
或{$x
是贪婪匹配还是非贪婪匹配。在
组合替换:可以将多个搜索/替换对传递给 Refex结合起来做更复杂的重写。例如:
# Rewrites "self.assertTrue(x == False)" to "self.assertFalse(x)", even though# that was not explicitly called out. refex --mode=py.expr -i --iterate \ --match='self.assertTrue($x == $y)' --sub='self.assertEqual($x, $y)'\ --match='self.assertEqual($x, False)' --sub='self.assertFalse($x)'\ -R dir/
TODO:还要描述--mode=py
。在
入门
安装
TODO:一旦PyPI上出现安装说明, 坚持住!在
现状
注:目前该项目正在向github进行初始上传,
PyPI等等,所以请不要广泛宣传。初始版本将是
一个0.1
版本。在
稳定:
在https://refex.readthedocs.io/中记录的API预计将保留 除了一些琐碎的重命名和移动之外,大部分都是相同的。在
这些命令行接口应该保持大致相同,没有 向后不兼容的更改:
--mode=py.expr
--mode=fix
--mode=re
不稳定
- 所有未记录的API(,尤其是用于创建新匹配器的API)。在
--mode=py.stmt
缺少许多安全和方便的功能。在--mode=py
,matcher接口,最终将需要一些相当大的 尽管简单的使用不受影响,但重新构造使其成为O(n)。在
(而且,所有稳定的部分也不稳定。这不是一个承诺,只是一个 期望/意向声明。)
贡献
另请参见
- asttokens:令牌保存 Refex构建在其上的AST库。在
- Pasta:使用AST的代码重写工具 变异而不是字符串模板。在
- Semgrep:跨语言AST 使用类似的方法进行搜索。在
- lib2to3: 基于具体语法树的标准库代码重写工具。在
免责声明
你可能已经注意到谷歌版权声明了。这不是正式的 支持谷歌产品。在
- 项目
标签: