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