我正在为我正在制作的游戏开发一些工具。这些工具用作前端,使编辑游戏文件变得更加容易。其中有几个文件是 python 脚本文件。例如,我有一个 Items.py 文件,其中包含以下内容(例如最小化)
from ItemModule import *
import copy
class ScriptedItem(Item):
def __init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower):
Item.__init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower, Item.GetNextItemID())
def Clone(self):
return copy.deepcopy(self)
ItemLibrary.AddItem(ScriptedItem("Abounding Crystal", "A colourful crystal composed of many smaller crystals. It gives off a warm glow.", ItemType.SynthesisMaterial, ItemType.SynthesisMaterial, 0, ItemUsage.Unusable, 0, 50))
正如我提到的,我想提供一个前端来编辑这个文件,而不需要编辑器知道 python/直接编辑文件。我的编辑需要能够:
- 查找并列出所有类类型(在此示例中,它只是 脚本项目)
- 查找并列出所有已创建的项目(在本例中只有一个, 丰富的 Crystal )。我需要找到类型(在这个 caseScriptedItem) 和所有参数值
- 允许编辑参数和创建/删除项目。
为此,我开始编写自己的解析器,寻找 class 关键字以及何时使用这些记录的类来构造对象。这适用于简单数据,但当我开始使用具有复杂构造函数(列表、映射等)的类时,正确解析变得越来越困难。
四处搜索后,我发现 IronPython 可以轻松解析 python 文件,所以这就是我着手做的事情。构建抽象语法树后,我使用 PythonWalkers 来识别和查找我需要的所有信息。这非常适合读取数据,但我没有看到将更新数据推送到 Python 文件的简单方法。据我所知,没有办法更改 AST 中的值,更不用说将 AST 转换回脚本文件了。如果我错了,我希望有人能告诉我如何做到这一点。我现在需要做的是搜索文件,直到找到正确的行,然后尝试将数据推送到构造函数中,确保顺序正确。
是否有一些我没有看到的明显解决方案?我是否应该继续研究我的解析器并使其支持更复杂的数据类型?我真的虽然我有它与 IronPython 解析器,但我没有想到将修改后的数据推回到文件中会有多棘手。
如有任何建议,我们将不胜感激
最佳答案
你想要源到源 program transformation tool .
这样的工具将语言解析为内部数据结构(通常是 AST),允许您修改 AST,然后可以从修改后的 AST 重新生成源文本,除了 AST 更改的地方外,基本上不会更改源的任何内容制作。
这样的程序转换工具必须将文本解析为 AST,并将“反解析”(称为“Prettyprint”)AST 解析为文本。如果 IronPython 有 pretty-print ,那就是您所需要的。 如果没有,您可以花费一些(也许很多)努力来构建一个;正如你所观察到的, 这并不像人们想象的那么容易。看我的回答 Compiling an AST back to source code
如果这不起作用,我们的 DMS Software Reengineering Toolkit与其 Python front end可能会成功。它具有上述所有特性。
关于c# - 从 C# 操作 Python 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923810/