python - 如何从外部重新定义函数中的可变变量?
问题描述
- 编辑以考虑初始反馈
要对模型中的某些参数进行敏感性分析,我想覆盖并重新定义单个变量。这个变量可以由用户手动选择。我无法让覆盖工作。
目前,我主要关注将 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 个不同的变量,因为这不会使它易于使用。
解决方案
为了使被调用的函数看起来更自然,将参数打包到一个没有特征的对象中:
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
推荐阅读
- tsql - SQL 查询中的 ELO 公式
- html - 使用 float-right 的 bootstrap 4 出现垂直问题
- javascript - CORS 错误:尝试访问 Azure Search Api 时对预检请求的响应未通过访问控制检查
- jmeter - jmeter http请求没有值,但名称错误
- angular - NullInjectorError:Angular 2 中没有 InjectionToken LOCAL_STORAGE 的提供者
- ios - tableview reloadData 点击headerSection展开行
- c# - 从 C# 文件或 fromdashboard 更改类别结构以匹配 Algolia 的
- javascript - Jquery 错误 - 未捕获的错误:语法错误,无法识别的表达式
- java - 我无法从 Java 控制面板运行我的 jar 文件
- javascript - Shopify - 结帐后在 Shopify 中添加 Cookie