要了解我的要求,让我们举个例子:
我有一个方法(该函数不是我的函数) 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):
那么有一种简单的方法来更改变量而不必重写整个代码吗?
答案 0 :(得分:2)
您不能在该方法内更改该变量。您需要更改定义方法。
答案 1 :(得分:0)
我认为这比重写代码更好
我认为我找到了一个不错的解决方法。我们inspect
和exec
为我工作
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]