如何清理Python环境

时间:2012-07-09 11:45:35

标签: python

我有一个创建Python代码并运行它的应用程序。在此过程中,我想清除两个方法分配,因为它们在第二次运行中会产生错误:

push = Writer.Push  
...  
def appPush(self):
    push(self)
    dumpRow(self)
...  
Writer.Push=appPush

这是我必须解决的遗留代码。如果你多次运行它,Python宣布有一个递归 我一直在寻找一种清除环境的方法,但'os.system('CLS')'没有帮助。我该如何清理这些作业?
谢谢。

编辑:
它是遗留代码。我还不是很熟悉它。我的应用程序创建了包含常规内容的Python代码(比如我上面发布的内容)以及用户工作流程到Python的翻译。如果用户创建的流程最终调用'appPush',则必须在1次运行后重新启动应用程序 我可以在上面的代码之后添加内容。我正在寻找的是一种从这些任务中清除口译员环境的方法。有可能吗?

3 个答案:

答案 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,以避免在代码第二次运行时覆盖它。