2012-07-09 4 views
0

J'ai une application qui crée du code Python et l'exécute. Au cours de ce processus, il y a deux affectations de méthode que je voudrais effacer, car ils créent une erreur dans la deuxième manche:Comment nettoyer l'environnement Python

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

Il est un code héritage que je dois corriger. Si vous exécutez ceci plus d'une fois, Python annonce qu'il y a une récursivité.
Je cherchais un moyen d'effacer l'environnement mais 'os.system (' CLS ')' n'a pas aidé. Comment puis-je nettoyer ces affectations?
Merci.

Éditer:
C'est un code hérité. Je ne suis pas encore très familier avec ça. Mon application crée du code Python qui contient des éléments généraux (comme le bit que j'ai posté ci-dessus) et une traduction du flux de travail de l'utilisateur vers Python. Si l'utilisateur crée un flux qui finit par appeler 'appPush', l'application doit être redémarrée après 1 exécution.
Je peux ajouter des choses après le code ci-dessus. Ce que je cherche est un moyen d'effacer l'environnement de l'interprète de ces tâches. C'est possible?

+1

Voulez-vous effacer la console? – SuperSaiyan

+0

Je ne veux pas d'écran clair (pas besoin de beaucoup \ n). Je veux que ces devoirs soient annulés d'une manière ou d'une autre. – Noich

+2

J'ai besoin de voir plus de code pour comprendre votre problème. 'os.system ('cls')' n'est * pas * ce que vous voulez là-bas. – cha0site

Répondre

2

OK, je vois quel est votre problème.

Ce code:

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

Est-ce que provoquer une récursion infinie si push n'a jamais été changé à appPush. Ce que vous voulez fondamentalement, il est un décorateur, donc si vous pouvez changer cela à:

def appPushCreator(func): 
    def appPush(self): 
     func(self) 
     dumpRow(self) 
    return appPush 

Writer.Push = appPushCreator(Writer.Push) 

Cela garderiez la sémantique implicite de faire une autre dumpRow chaque fois que vous avez utilisé ce morceau de code.

Je ne pense pas que vous pouvez corriger votre erreur en ajoutant seulement le code après le bit cassé. Vous ne pouvez pas «effacer l'environnement» et récupérer votre Writer.Push d'origine.

+0

Cela semble être juste la chose dont j'avais besoin, merci! Maintenant, je voudrais fouiller dans de la documentation afin que je puisse comprendre complètement. Des recommandations? – Noich

+1

@Noich: Cela se heurte à une certaine subtilité avec la définition de fermeture lexicale de Python. C'est le genre de plaisir que vous rencontrez lorsque vous utilisez la programmation fonctionnelle, mais n'interdisez pas les effets secondaires. Il est discuté dans cette question SO: http://stackoverflow.com/questions/233673/lexical-closures-in-python – cha0site

1

Quelque chose comme cela devrait fonctionner:

real_push = None 
if real_push is None: 
    real_push = push 
Writer.Push = real_push 

Il pourrait mieux de mettre en code avant le code cassé:

real_push = None 
if real_push is None: 
    real_push = Writer.Push 
Writer.Push = real_push 

Essentiellement, vous essayez de faire le code idempotent-à-dire l'exécuter plus d'une fois a le même effet que de l'exécuter une fois.

0

Vous ne pouvez tester Writer.Push is appPush en Python 2.x parce Writer.Push enveloppé dans une obtient méthode non liée, mais vous pouvez accéder aux attributs sur Writer.Push et ils passent par la fonction d'origine. En outre, si vous utilisez un attribut, cela signifie que cela n'a pas d'importance si vous n'avez pas la fonction de correctif d'origine à tester. Cela signifie que cela devrait fonctionner:

def appPush(self): 
    push(self) 
    dumpRow(self) 
appPush.is_patch = True 
... 

if not hasattr(Writer.Push, 'is_patch'): 
    push = Writer.Push 
    Writer.Push=appPush 

Notez que vous souhaitez déplacer l'affectation à l'intérieur du pushif pour éviter d'écraser quand le code est exécuté pour une deuxième fois.