首页 > 解决方案 > 如何从外部重新定义函数中的可变变量?

问题描述

要对模型中的某些参数进行敏感性分析,我想覆盖并重新定义单个变量。这个变量可以由用户手动选择。我无法让覆盖工作。

目前,我主要关注将 locals() 或 globals() 设置为正确的值,但如下所示。这没有用。

我的代码中有两个重要部分:首先是 Main 函数,它负责创建模型的所有工作。它有很多变量,如图所示:Wave_height

def Main(loopname, loopvalue = 0):

    Wave_height = 2 #m
    # And_many_other_characteristics

    # redefine one single variable name
    vars()[loopname] = loopvalue
    globals()[loopname] = loopvalue
    locals()[loopname] = loopvalue
    print (Wave_height)

    return_info = 1 ## rows of code i dont want to bother you with ##

    return(return_info)

if __name__ == "__main__":
    Main("testname", 0)

对于敏感性分析,我希望所有变量都保持不变,除了一个变量。假设我想改变 Wave_height。我想做类似以下代码的事情:

import Main
import numpy as np

loopname = "Wave_height"
loopvalue = [1,2,3]

max_z_displacement = np.zeros(len(loopvalue))

for i in range (len(loopvalue)):
    return_info = Main.Main(loopname, loopvalue[i])
    max_z_displacement[i] = return_info[2]

目前,印刷品如下:

2

我希望结果是:

1

我想避免在 def-row 中使用 50 个不同的变量,因为这不会使它易于使用。

标签: pythonvariablesgloballocal

解决方案


为了使被调用的函数看起来更自然,将参数打包到一个没有特征的对象中:

class Parameters(object):
  def __init__(self,**attr): vars(self).update(attr)
def calc(**over):
  p=Parameters(Wave_height=2,…)
  vars(p).update(over)
  do_stuff(p.Wave_height,…)
  do_more(p.other_data)
  …

for h in heights:
  calc(Wave_height=h)
  calc(**{"Wave_height":h})  # to choose parameter dynamically

推荐阅读