我有一个创建Python代码并运行它的应用程序。在此过程中,我想清除两个方法分配,因为它们在第二次运行中会产生错误:
push = Writer.Push
...
def appPush(self):
push(self)
dumpRow(self)
...
Writer.Push=appPush
这是我必须解决的遗留代码。如果你多次运行它,Python宣布有一个递归
我一直在寻找一种清除环境的方法,但'os.system('CLS')'没有帮助。我该如何清理这些作业?
谢谢。
编辑:
它是遗留代码。我还不是很熟悉它。我的应用程序创建了包含常规内容的Python代码(比如我上面发布的内容)以及用户工作流程到Python的翻译。如果用户创建的流程最终调用'appPush',则必须在1次运行后重新启动应用程序
我可以在上面的代码之后添加内容。我正在寻找的是一种从这些任务中清除口译员环境的方法。有可能吗?
答案 0 :(得分:2)
好的,我知道你的问题是什么。
此代码:
push = Writer.Push
def appPush(self):
push(self)
dumpRow(self)
Writer.Push=appPush
如果push
更改为appPush
,则会导致无限递归。您基本上想要的是装饰器,所以如果您可以将其更改为:
def appPushCreator(func):
def appPush(self):
func(self)
dumpRow(self)
return appPush
Writer.Push = appPushCreator(Writer.Push)
每次使用该位代码时,这将保留另一个dumpRow
的隐含语义。
我不认为您可以通过在损坏位之后添加代码来修复错误。您无法“清除环境”并恢复原来的Writer.Push
。
答案 1 :(得分:1)
这样的事情应该有效:
real_push = None
if real_push is None:
real_push = push
Writer.Push = real_push
在破坏的代码之前输入代码可能会更好:
real_push = None
if real_push is None:
real_push = Writer.Push
Writer.Push = real_push
基本上你是在尝试使代码幂等,即多次运行它与运行一次具有相同的效果。
答案 2 :(得分:0)
你不能只在Python 2.x中测试Writer.Push is appPush
因为Writer.Push
被包装在一个未绑定的方法中,但是你可以访问Writer.Push
上的属性并且它们会进入原始版本功能。此外,如果您使用一个属性,这意味着如果您没有原始补丁函数进行测试则无关紧要。这意味着这应该有效:
def appPush(self):
push(self)
dumpRow(self)
appPush.is_patch = True
...
if not hasattr(Writer.Push, 'is_patch'):
push = Writer.Push
Writer.Push=appPush
请注意,您希望将作业移至push
内的if
,以避免在代码第二次运行时覆盖它。