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

你不能。如果变量是函数的本地变量,则它不存在,除非函数正在执行。即使可以,管理此 hack 也不太可能比管理您对库的自定义更改(或要求库开发人员更改它以使变量可访问)更容易。

于 2012-08-30T05:55:28.093 回答
2

创建补丁并将其发送给库作者。他们会将其应用到他们的代码库中,并感谢您的参与。只需以可配置的方式进行 - 例如添加创建该字典的新方法,您想扩展。然后,您可以在子类中覆盖该新方法,并且补丁不会特定于您的项目。

如果库所有者合并了您的补丁,一旦发布,您就可以使用更新版本的库。

于 2012-08-30T07:13:58.600 回答
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 回答