【问题标题】:making self-modifying code easier使自修改代码更容易
【发布时间】: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 codeoptimization of state dependent loops. 在此处发布之前,您应该阅读更多关于此主题的内容。
  • 您能详细说明一下吗?您也可以将 3,4,5,6 行简化为:with open(sys.argv[0], 'w') as f : f.write(''.join(x))
  • 基本上,我对自修改代码很感兴趣,但我知道python不会是通常使用的语言,但这让我对研究自修改代码特别是python感兴趣,我觉得我这里的代码有点乱,所以我想问有没有办法让它更整洁,因为一个巨大的列表有点烦人。
  • 如果您只对每次运行程序时获得不同的输出感兴趣,您可以完全不修改源代码。您可以使用诸如picklejsonshelve 之类的序列化模块来跟踪程序执行了多少次,并使用一个大的if-elif 块来根据该数字生成输出。但我猜这违背了你实验的目的。

标签: python self-modifying


【解决方案1】:

不需要列表,使用字符串即可:

import sys

newcode = 'num = 0\nfrom threading import *\nimport sys\ndef 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\ndef 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\ndef 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\ndef 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\nif 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\nelif num == 2:\n\tThread(target=showfile).start()\n\tdelline(26)\n\tchange("num = 3")\n\tnum += 1\n\thorse69\nelif 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\nelif num == 5:\n\tThread(target=showfile).start()\n\tdelline(21)\n\tchange("num = 6")\n\tnum += 1\n\thorse69\nelif num == 6:\n\tprint("EVOLUTION COMPLETE")\n\traw_input()\n'

with open(sys.argv[0], 'w') as f:
    f.write(newcode)

对内部代码应用相同的原则可能有助于缩短代码。

【讨论】:

  • 没想到,它确实使它更整洁更好看,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2013-06-29
  • 2023-04-05
相关资源
最近更新 更多