0

最有效的方法 - 我知道它不是很有效,但老实说我找不到更好的方法 - 操作 Python (.py) 文件,添加/减去/附加代码,是使用我的基本文件/O 模块包含在 Python 中吗?

例如:

obj = open('Codemanipulationtest.py', 'w+')
obj.write("print 'This shows you can do basic I/O?'")
obj.close()

将操作我拥有的一个名为“codemanipulationtest.py”的文件,并向其中添加一条打印语句。这是可以解决的问题,还是有任何更简单或更安全/有效的方法来操作/创建新的 python 代码?

我读过这个:解析一个 .py 文件,读取 AST,修改它,然后写回修改后的源代码

老实说,I/O 方法似乎更容易。我对 Python 有点陌生,所以我可能只是表现得很愚蠢......在此先感谢您的任何回复。

编辑

这一切的重点只是玩弄代码的效果。我正在考虑将我最终使用的任何东西连接到某种学习算法,看看它一次生成少量代码的效果如何,看看它可以从那里去哪里......

4

2 回答 2

1

这取决于您将使用生成的代码做什么。您有几个选项,每一个都比上一个更高级。

  • 创建文件并导入
  • 创建一个字符串和exec
  • 编写代码以直接创建类(或模块)而不是文本,将您需要的任何功能插入其中
  • 直接生成 Python 字节码并执行它!

如果您正在编写将被其他程序员使用和修改的代码,那么第一种方法可能是最好的。否则,对于大多数用例,我建议使用第三种。最后一个只适用于受虐狂和前汇编语言程序员。

如果您想修改现有的 Python 源代码,有时可以通过基本的搜索和替换来进行简单的修改,特别是如果您对正在使用的源文件有所了解,但更好的方法是ast模块。这为您提供了 Python 源代码的抽象表示,您可以对其进行修改,然后直接编译成 Python 对象。

于 2012-07-05T18:51:16.530 回答
1

为了生成代码,我会将其分解为各种类、IF 类、FOR 类等。然后您可以使用输出,其中每个类都有一个 to_str() 方法,您可以依次调用该方法。

statements = [ ... ]

obj = open( "some.py", "w+" )

for s in statements:
    obj.write( s.to_str() )

obj.close()

通过这种方式,您可以轻松地扩展您的项目,并且它会更易于理解和灵活。而且,它与您想要的简单写入方法的使用保持一致。

根据学习算法,这种对各种类别的突破可以很好地导致一种用于代码的伪遗传算法。您可以将基因组编码为一系列语句,然后您只需要找到一种方法来将参数传递给每个语句(如果需要)等。

于 2012-07-05T19:11:37.733 回答