我编写了一个Python类Code,它能够让您向对象添加和删除新的代码行,打印代码并执行它。Code类在文末展示。
例如:如果x等于1,则该代码将其值更改为x = 2,然后删除整个检查该条件的条件块。
x = 1
code = Code()
code + 'global x, code'
code + "if x == 1:"
code[1] + "x = 2"
code[1] + "del code[1]"
创建代码后,您可以打印它:
#Prints
print "Initial Code:"
print code
print "x = " + str(x)
输出:
Initial Code:
global x, code
if x == 1:
x = 2
del code[1]
x = 1
通过调用对象来执行代码:code()
print "Code after execution:"
code() #Executes code
print code
print "x = " + str(x)
输出结果2:
Code after execution:
global x, code
x = 2
正如您所看到的,代码将变量x更改为值2并删除整个if块。这可能有助于避免在满足条件后进行条件检查。在现实生活中,这种情况可以通过协程系统来处理,但这种自修改代码实验只是为了好玩。
class Code:
def __init__(self,line = '',indent = -1):
if indent < -1:
raise NameError('Invalid {} indent'.format(indent))
self.strindent = ''
for i in xrange(indent):
self.strindent = ' ' + self.strindent
self.strsubindent = ' ' + self.strindent
self.line = line
self.subcode = []
self.indent = indent
def __add__(self,other):
if other.__class__ is str:
other_code = Code(other,self.indent+1)
self.subcode.append(other_code)
return self
elif other.__class__ is Code:
self.subcode.append(other)
return self
def __sub__(self,other):
if other.__class__ is str:
for code in self.subcode:
if code.line == other:
self.subcode.remove(code)
return self
elif other.__class__ is Code:
self.subcode.remove(other)
def __repr__(self):
rep = self.strindent + self.line + '\n'
for code in self.subcode: rep += code.__repr__()
return rep
def __call__(self):
print 'executing code'
exec(self.__repr__())
return self.__repr__()
def __getitem__(self,key):
if key.__class__ is str:
for code in self.subcode:
if code.line is key:
return code
elif key.__class__ is int:
return self.subcode[key]
def __delitem__(self,key):
if key.__class__ is str:
for i in range(len(self.subcode)):
code = self.subcode[i]
if code.line is key:
del self.subcode[i]
elif key.__class__ is int:
del self.subcode[key]