【发布时间】:2017-04-04 17:53:11
【问题描述】:
我做了一个在python 2.7上运行的自我修改代码,代码有点大,我想知道是否有办法让代码更容易一些,我考虑过但没有找到任何答案...如果有人能帮我一把,我将不胜感激,但无论如何,这是代码
import sys
x = ['num = 0\n', 'from threading import *\n', 'import sys\n', 'def change(b, line=1):\n', '\tline -= 1\n', '\tf = open(sys.argv[0])\n', '\tg = f.readlines()\n', '\tlines = []\n', '\tfor i in g:\n', '\t\tlines.append(i)\n', '\tlines[line] = b+"\\n"\n', "\tf = open(sys.argv[0], 'w')\n", '\tfor each in lines:\n', '\t\tf.write(each)\n', '\tf.close()\n', '\t\n', 'def addline(b):\n', '\tf = open(sys.argv[0])\n', '\tg = f.readlines()\n', '\tlines = []\n', '\tfor i in g:\n', '\t\tlines.append(i)\n', '\tlines.append("\\n"+b)\n', "\tf = open(sys.argv[0], 'w')\n", '\tfor each in lines:\n', '\t\tf.write(each)\n', '\tf.close()\n', '\t\n', 'def delline(b = 10):\n', '\tf = open(sys.argv[0])\n', '\tg = f.readlines()\n', '\tlines = []\n', '\tfor i in g:\n', '\t\tlines.append(i)\n', '\tleng = len(lines) - b\n', '\tlines = lines[:leng]\n', "\tf = open(sys.argv[0], 'w')\n", '\tfor each in lines:\n', '\t\tf.write(each)\n', '\tf.close()\n', '\t\t\n', 'def showfile():\n', '\tcheck = num\n', '\tf = open(sys.argv[0])\n', '\tg = f.readlines()\n', '\twhile num != check + 1:\n', '\t\tfor i in g:\n', '\t\t\tprint i\n', '\t\n', '\t\n', 'if num == 0:\n', '\tThread(target=showfile).start()\n', '\tf = open("values.py", \'w\')\n', '\twriter = [\'linestowrite1 = [\\\'import os\\\\n\\\', \\\'from time import *\\\\n\\\',\\\'os.system("cls")\\\\n\\\', \\\'print("hello...")\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'os.system("cls")\\\\n\\\', \\\'print("I am a program that is able to evolve by itself")\\\\n\\\', \\\'sleep(4)\\\\n\\\', \\\'os.system("cls")\\\\n\\\', \\\'print("everytime someone opens me, I evolve")\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'os.system("cls")\\\\n\\\',\\\'change("num = 2")\\\\n\\\' \\\'raw_input("press ENTER to exit")\\\\n\\\']\\n\', \'linestowrite2 = [\\\'from time import *\\\\n\\\', \\\'f = open(sys.argv[0])\\\\n\\\', \\\'g = f.readlines()\\\\n\\\', \\\'leng = len(g)\\\\n\\\', \\\'sleep(1)\\\\n\\\', \\\'print("CURRENT LENGTH : "+str(leng))\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'print("Extending length to : "+str(leng+20))\\\\n\\\', \\\'sleep(3)\\\\n\\\', \\\'change("num = 5")\\\\n\\\', \\\'\\\\t\\\']\']\n', '\tfor i in writer:\n', '\t\tf.write(i)\n', '\tf.close()\n', '\timport values\n', '\ttowrite = values.linestowrite1\n', '\tfor i in towrite:\n', '\t\taddline(i)\n', '\tchange("num = 1")\n', '\tnum += 1\n', 'elif num == 2:\n', '\tThread(target=showfile).start()\n', '\tdelline(26)\n', '\tchange("num = 3")\n', '\tnum += 1\n', '\thorse69\n', 'elif num == 3:\n', '\tThread(target=showfile).start()\n', '\timport values\n', '\ttowrite = values.linestowrite2\n', '\tfor i in towrite:\n', '\t\taddline(i)\n', '\tchange("num = 4")\n', '\tnum += 1\n', 'elif num == 5:\n', '\tThread(target=showfile).start()\n', '\tdelline(21)\n', '\tchange("num = 6")\n', '\tnum += 1\n', '\thorse69\n', 'elif num == 6:\n', '\tprint("EVOLUTION COMPLETE")\n', '\traw_input()\n']
f = open(sys.argv[0], 'w')
for i in x:
f.write(i)
f.close()
提前谢谢你
【问题讨论】:
-
你想在这里完成什么?自修改代码不是 Python 中的标准习惯用法。
-
虽然这是一个很酷的想法,但 SO 不是寻求一般编码建议的地方,请让问题更具体。虽然我确实建议您先阅读一些内容:self-modifying code 和 optimization of state dependent loops. 在此处发布之前,您应该阅读更多关于此主题的内容。
-
您能详细说明一下吗?您也可以将 3,4,5,6 行简化为:
with open(sys.argv[0], 'w') as f : f.write(''.join(x)) -
基本上,我对自修改代码很感兴趣,但我知道python不会是通常使用的语言,但这让我对研究自修改代码特别是python感兴趣,我觉得我这里的代码有点乱,所以我想问有没有办法让它更整洁,因为一个巨大的列表有点烦人。
-
如果您只对每次运行程序时获得不同的输出感兴趣,您可以完全不修改源代码。您可以使用诸如
pickle或json或shelve之类的序列化模块来跟踪程序执行了多少次,并使用一个大的if-elif 块来根据该数字生成输出。但我猜这违背了你实验的目的。
标签: python self-modifying