一般说明: 首先: 我需要创建数百个从API获取数据的模块。这些模块大部分都具有相似的结构,但有些元素会有所不同(例如,它们的方法)。
其次: 其中许多模块必须稍后进行编辑(例如,更改模块中的方法)。
THEREFOR 我创建了一个程序:
代码示例
# I want to edit module_1 to module_100 and change their cook_method to bake_method.
# Below is the code for only one of the 100 modules.
with open('module_1.py', 'w+') as file:
old = file.read()
# method_loc is a function that returns a dict,
# containing start and end of the method i wanted to edit.
location_dct = method_loc(name='cook_method', string=old)
# change cook_method to bake_method
new = old[:location_dct['end']] + bake_method_as_string + old[location_dct['start']:]
file.write(new)
问题: 检测课程结束的确切位置非常困难。我使用字符串方法为它创建方法,但感觉太复杂和草率。我搜索并找到regular expressions,这可能会使上述更容易。
还找到了pyclbr,如果它可以给我一个课程结束的路线,那就太棒了,但它并没有。
问题
答案 0 :(得分:0)
我认为你需要编写正则表达式来匹配整个模块。通过re.compile创建一个模式,并将其与正确放置的括号匹配以获取匹配的文本。然后,您可以使用模式匹配再次搜索方法名称,并在到达正确的位置后应用修改。你也可以使用PLY。查看有关编译器的书籍,以便快速了解正则表达式。 希望它能解决你的问题。
答案 1 :(得分:0)
通常,最好处理代码的解析版本,即Abstract Syntax Tree。这更可靠,更简单等,Python有standard module for that。
但是,由于您正在处理非常特殊的情况(您只需要替换一个类,而这是您自己生成的代码),您可以使用以下注释标记代码:
#CLASSBEGIN MyClass
class MyClass:
...
#CLASSEND MyClass
这样,您无需解析代码。据我记忆,很少有代码生成工具使用这种方法。
另一种方法是使用模板引擎生成代码,例如Jinja2,因此您不需要修改生成的类,只需更新参数并重新生成新版本。< / p>
最后,在许多情况下,您可以尝试通过适当的对象分解来最小化数量或完全摆脱动态生成的代码。