【问题标题】:Changing local variables inside functions or methods in python在python中更改函数或方法中的局部变量
【发布时间】:2012-08-30 05:49:59
【问题描述】:

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

【问题讨论】:

  • "...这将使与上游更改的合并变得更加困难。"这就是 git 的用途。或者提供一个补丁来外部化变量。
  • 如果您与上游的分歧太多并直接在上游的文件中更改所有内容,您将无法轻松应用补丁和挑选。它是关于 openstack 的,它提供了一种扩展 api 的方法,因此我们创建了自己的 API 扩展,这是建议的方式。我们现在可以轻松地合并错误修复,而不必总是手动应用补丁,因为文件不再匹配。不过我同意你的观点,这是一个很好的观点。为它 +1。
  • 您不能操纵局部变量,但您当然可以以某种方式操纵结果。由于我假设在代码的某处使用并应用了局部变量,它不仅具有局部范围,因此您可能希望准确地“挂钩”在那里。但是如果没有更多细节,很难帮助你。另一种选择是完全覆盖 update_resources,而不调用 super。

标签: python


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果库所有者合并了您的补丁,您将能够在更新版本的库发布后使用它。

    【讨论】:

      【解决方案3】:

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

      我们目前正在使用 git rebase,所以当新版本发布时,我们只需执行 git

      git checkout our_changes_to_upstream_branch
      git rebase -i upstream/master
      

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

      通常此时如果存在冲突,我们只是跳过它并创建一个票给原始提交作者制作一个新补丁,看看是否仍然需要补丁。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-08
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        • 2016-05-23
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多