在python中更改函数或方法内的局部变量

时间:2012-08-30 05:49:59

标签: python

我正在扩展一个开源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

3 个答案:

答案 0 :(得分:2)

你做不到。如果变量是函数的本地变量,则除了函数执行时它不存在。即使你可以,管理这个hack也不太可能比管理库的自定义更改(或要求库开发人员更改它以便变量可访问)。

答案 1 :(得分:2)

创建补丁并将其发送给图书馆作者。他们会将它应用到他们的代码库中,并感谢您的参与。只是以可以配置的方式来做 - 比如添加创建该字典的新方法,你想扩展。然后,您可以在子类中覆盖该新方法,并且该修补程序不会特定于您的项目。

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

答案 2 :(得分:0)

正如Ignacio Vazquez-Abrams所说,这就是Git的用途,似乎是最好的建议。但不是问题的答案。我仍然想让其他用户看到这个,如果他们正在努力

我们目前正在使用git rebase,所以当新版本发布时我们只是做一个git

git checkout our_changes_to_upstream_branch
git rebase -i upstream/master

在我们修改过的分支上。这将显示我们已完成的提交列表,让我们手动选择不再需要的提交。之后它将删除我们的更改并将其临时保存到git中的某个位置,然后使用上游快速前进,并且在最新版本的上游之后,它将在最新版本之上重放我们的更改。如果存在冲突,它将停止,您可以指定是否要手动合并或跳过。

通常在此时如果发生冲突,我们只是跳过它并创建一张原始提交作者的票证,以制作新的补丁并查看补丁是否仍然需要。

我们注意到大多数补丁需要重写,但这是最干净的方法。如果有任何改进,很高兴听到他们!

相关问题