Python在运行时从另一个模块更改函数的局部变量

时间:2018-10-28 10:25:06

标签: python python-2.7

要了解我的要求,让我们举个例子:

我有一个方法(该函数不是我的函数) m在类c中声明。此方法包含大约200行。我只想向函数内部声明的列表中添加一个元素。

   class c(object):
        def m(self):
            .....
            .....
            .....
            ls = [1,2,3]
            for l in ls:
                 ......
                 ......
                 ......
                 ......

我的问题是列表应该为[1,2,3,4]。我不想复制该方法的整个代码,只是为了更改ls变量,而该方法不是我的,所以 如果以后有一些更新,我想使用它们。

我试图查看Python如何将局部变量保存在函数对象中,但我不理解如何设置关系。

# this tuple is so complicated 
m.__code__.co_consts

因此,有没有一种简便的方法来更新此变量,还是我必须通过分析变量并查看将4元素放在何处来对其进行更新以将元素添加到列表中?

我为此问题进行了大量搜索,但是我只找到了一种方法来重写内部方法(答案属于@Martijn Pieters):

Override inner method

那么有一种简单的方法来更改变量而不必重写整个代码吗?

2 个答案:

答案 0 :(得分:2)

您不能在该方法内更改该变量。您需要更改定义方法。

答案 1 :(得分:0)

我认为这比重写代码更好

我认为我找到了一个不错的解决方法。我们inspectexec为我工作

Ex

       # let say this module is a.py

       def m():
           casts = [1,2,3]
           return casts

更改m巫婆是一种库函数,以后可以更新。

       import a
       from a import *  # i don't want to warry about global variable that are accesed by m in the future
       import inspect
       # get the source code
       m_source_code = inspect.getsource(m)  
       # replace the part that i want
       m_source_code = m_souce_code.replace('[1,2,3]', '[1,2,3,4]')
       # this will override `m` in local module
       exec m_source_code  
       o.m = m # override it in the original module

       print o.m() # this prints [1,2,3,4]