如何在python中重建局部变量环境?

How to reconstruct a local variable environment in python?

我正在重新格式化一堆数据处理代码。原代码首先声明了几个函数,它们具有一定的拓扑依赖性(这意味着某个函数依赖于其他函数的结果),然后顺序调用它们(使用正确的拓扑排序):

def func_1(df):
    return df.apply(...)

def func_2(df):
    return pd.concat([df, ...])

def func_3(df_1, df_2):
    return pd.merge(df_1, df_2)

if __name__ == "__main__":
    df=...
    df_1 = func_1(df)
    df_2 = func_2(df)
    result = func_3(df_1, df_2)# the func_3 rely on the result of func_1 & func_2

问题是我无法检索中间数据。假设我只想应用 func_1 & func_2,我需要更改一些代码。当拓扑依赖变得复杂时,它会变得复杂。

所以我想变成类似于 makefile 的递归配方:

def recipe_1(df):
    return df.apply(...)

def recipe_2(df):
    return pd.concat([df, ...])

def recipe_3(df):
    df_1 = recipe_1(df)
    df_2 = recipe_2(df)
    #some process here.
    return 

if __name__ == '__main__':
    df = ...
    recipe_3(df) #Just call the intermediate node I need.

这种方法的问题是我需要从recipe_3中的recipe_1recipe_2收集很多变量,所以我认为如果我能够从 locals() 中检索变量,这将使 #some process here. 中的其他代码保持不变。

现在我在想这样的事情,但它看起来很难看:

def func_to_be_reconstructed():
    a = 3
    return locals()

local_variables = func_to_be_reconstructed()
for key in local_variables.keys():
    exec(str(key) + '= local_variables[\'' + str(key) + '\']')

更好的解决方案?

这可能是不好的做法,但是您可以在希望在函数外部引用的变量上使用 global 关键字。

def func_to_be_reconstructed():
    global a
    a = 3

print(a)

如果您只需要几个变量,这将特别有用。看看这个related question.

编辑:一个全局列表可以填充多个变量:

def write_to_msv(*vars):
    global my_special_var
    my_special_var = []
    for k in vars:
        my_special_var.append(k)

myvar1 = 123
myvar2 = "hello"
myvar3 = {'no shoes': 'no service'}

write_to_msv(myvar1, myvar2, myvar3)

print(my_special_var)

再次:

这看起来更干净了一点,但功能基本相同。

for var,value in func_to_be_reconstructed().items(): f"{var} = {value}")

globals() and locals() 只是口述...

所以,不要以这种可疑的方式使用 exec,只需 update 字典:

def func_to_be_reconstructed():
    a = 3
    return locals()

globals().update(func_to_be_reconstructed())