Python:修改自身的程序

时间:2013-12-11 04:23:00

标签: python printing save

我正在编写一个会运行大量打印输出的程序。我真正想做的就是拥有打印输出的某些部分,在关闭后直接写入我的程序。

认为有一个'save()'函数就像'print()'的相似之处那样:

string = "#this my generated comment"
save(string,line)

行当然是您希望将字符串保存到程序中的行。现在请记住,我不仅仅想限制添加注释,我希望代码能够在下次调用新行时执行。

如果唯一的方法是保存文件,编辑然后重新加载,那很好。非常感谢基本的演练,

编辑:或者,我不反对将添加的行保存到另一个文件然后从程序中导入它的想法。

感谢,

2 个答案:

答案 0 :(得分:3)

不要试图修改正在运行的模块/程序的源代码,而应考虑以下任何一项:

  • 将您的数据写入JSON / Pickle序列化文件。
  • 将您的数据写入CSV文件。
  • 使用SQLite(附带大多数Python发行版
  • 使用任何其他类型的真实数据库。

一些有用的链接:

答案 1 :(得分:1)

评论者声称,即时修改python程序是糟糕的形式/糟糕的做法,这可能是非常错误的。这是我在很多场合亲自使用的python的主要特征之一(作为研究PL理论的CS研究生)。然而,它们是正确的,使用像“x = x + 1”这样的字符串进行元编程是不好的形式。如果您想动态更改程序的操作,请使用type function。另请参阅以下有关python中元编程的教程:

http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Metaprogramming.html

如果你真的需要在程序的运行中保存一个类的实例,那么你可以使用詹姆斯米尔斯在答案中指出的pickle library。它很简单:

#!/usr/bin/python

class HelloWorld:

  def __init__(self, string):
    self.string = string

  def run(self):
    print self.string

import pickle
pickle.dump(HelloWorld, open("prog.pkl", 'w'))
HW = pickle.load(open("prog.pkl", 'r'))
x = HW("Hello World")
x.run()

编辑:为了拥有“将在下次调用新行时执行的代码”,您不想使用inspect.getsource(),而应该(遵循上面的代码):

import types
def newfncn(self):
  print self.string + " 2.0!"
x.run = types.MethodType(newfncn, x)
x.run()

如果您确实必须使用字符串编辑代码,您可以执行以下操作:

import types
def newfncn(self):
  exec("print self.string + \" 2.0!\"")
x.run = types.MethodType(newfncn, x)
x.run()

我强烈反对。