0

私はオープン ソースの Python 製品を拡張していますが、アップストリームの変更とのマージが難しくなるため、コードを直接変更することはできません。

したがって、関数を直接変更する代わりに、関数内のローカル変数を別の場所から操作したいと考えています。関数内でローカル変数として作成された辞書にキーを追加したい。このローカル dic 変数を変更するにはどうすればよいですか? これは可能ですか?

以下のコードを例にとります。

import functools
class API(object):

    def update_resources(self, host):
        bla = sflkj
        dic = {
            'cpu': 5,
            'memory': 500
        }

class APIExtension(API):
    def update_resources(self, host):
        # But first do our changes to the function here
        # The change that I want to do is add a key: 'workload'
        # this is the function I want to change the dic variable to include workload
        super(APIExtension, self).update_resources
4

3 に答える 3

2

パッチを作成し、ライブラリの作成者に送信します。彼らはそれをコードベースに適用し、あなたの関与に感謝します. 構成可能な方法でそれを行うだけです-その辞書を作成する新しいメソッドを追加するなど、拡張したい. 次に、サブクラスでその新しいメソッドをオーバーライドすると、パッチはプロジェクトに固有のものではなくなります。

ライブラリの所有者がパッチをマージした場合、ライブラリの新しいバージョンがリリースされると、それを使用できるようになります。

于 2012-08-30T07:13:58.600 に答える
2

できません。変数が関数に対してローカルである場合、関数が実行されているとき以外は存在しません。たとえできたとしても、このハックを管理することは、ライブラリへのカスタム変更を管理する (または、変数にアクセスできるようにライブラリ開発者に変更を依頼する) よりも簡単ではないでしょう。

于 2012-08-30T05:55:28.093 に答える
0

Ignacio Vazquez-Abramsが言ったように、それがGitの目的であり、最良のアドバイスのようです。しかし、質問に対する答えではありません。彼らが苦労しているなら、私はまだ他のユーザーにこれを見てもらいたかった

現在、git rebaseを使用しているため、新しいリリースがリリースされたら、gitを実行するだけです。

git checkout our_changes_to_upstream_branch
git rebase -i upstream/master

変更されたブランチで。これにより、実行したコミットのリストが表示され、不要になったコミットを手動で選択できます。その後、変更を削除してgitのどこかに一時的に保存し、アップストリームで早送りし、アップストリームの最新バージョンになったら、最新バージョンの上に変更を再生します。競合がある場合は停止し、手動でマージするかスキップするかを指定できます。

通常、この時点で競合が発生した場合は、それをスキップして元のコミット作成者へのチケットを作成し、新しいパッチを作成して、パッチがまだ必要かどうかを確認します。

ほとんどのパッチは書き直しが必要ですが、これが最もクリーンな方法であることに気づきました。何か改善があれば、それを聞いてうれしいです!

于 2012-09-20T01:59:25.807 に答える