0

Pythonコードを作成して実行するアプリがあります。このプロセス中に、2回目の実行でエラーが発生するため、クリアしたい2つのメソッド割り当てがあります。

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

これは私が修正しなければならないレガシーコードです。これを複数回実行すると、Pythonは再帰があることを通知します。
環境をクリアする方法を探していましたが、「os.system('CLS')」は役に立ちませんでした。これらの割り当てをクリーンアップするにはどうすればよいですか?
ありがとう。

編集:
それはレガシーコードです。まだなじみがありません。私のアプリは、一般的なもの(上記で投稿したビットなど)とユーザーのワークフローのPythonへの変換を含むPythonコードを作成します。ユーザーが「appPush」を呼び出すことになるフローを作成した場合、アプリケーションは1回の実行後に再起動する必要があります。
上記のコードの後に​​何かを追加できます。私が探しているのは、それらの割り当てから通訳者の環境を取り除く方法です。出来ますか?

4

3 に答える 3

2

OK、あなたの問題が何であるかわかります。

このコード:

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

于 2012-07-09T12:18:19.580 に答える
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

基本的に、コードをべき等にしようとしています。つまり、コードを複数回実行すると、1回実行した場合と同じ効果があります。

于 2012-07-09T12:15:02.137 に答える
0

バインドされていないメソッドにラップされているWriter.Push is appPushため、Python 2.xでテストすることはできませんが、属性にアクセスすると、元の関数に渡されます。また、属性を使用する場合は、テストする元のパッチ関数がなくても問題ありません。つまり、これは機能するはずです。Writer.PushWriter.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

コードが2回実行されたときに割り当てが上書きされないように、割り当てをpush内部に移動する必要があることに注意してください。if

于 2012-07-09T12:56:27.273 に答える