假设我正在尝试构建一个模型对象m
。
我想把一些变量和方程附加到m
,所以我有:
class ModelBuilder():
def build_model():
m = MyModel()
self.add_variables(m)
self.add_equations(m)
if self.feeling_good:
self.add_other_equations_sometimes(m)
return m
def add_variables(self, m):
m.a = MyVar(domain=Reals)
m.b = MyVar()
m.c = MyVar()
...
def add_equations(self, m):
m.pythagoras = MyEqn(expression=m.a ** 2 + m.b ** 2 == m.c ** 2)
...
def add_other_equations_sometimes(self, m):
m.eqnname = MyEqn(expression=m.a + m.b == m.c)
...
这很管用。但是假设我有很多变量和一些复杂的方程,我不想为表达式中的所有东西都写m.<name>
。我宁愿看a ** 2 + b ** 2 == c ** 2
如果我把所有的东西都放在一个函数中,并且有:
def add_modelthings(self, m):
a = m.a = MyVar(domain=Reals)
b = m.b = MyVar()
c = m.c = MyVar()
...
m.pythagoras = MyEqn(expression=a ** 2 + b ** 2 == c ** 2)
...
if self.feeling_good:
m.eqnname = MyEqn(expression=a + b == c)
...
但是对于一个大模型,我有一个非常混乱的函数。使用locals()或globals()很有诱惑力:
class ModelBuilder():
def build_model():
m = MyModel()
var_dict = self.add_variables(m)
self.add_equations(m, var_dict)
if self.feeling_good:
self.add_other_equations_sometimes(m, var_dict)
return m
def add_variables(self, m):
a = m.a = MyVar(domain=Reals)
b = m.b = MyVar()
c = m.c = MyVar()
...
return locals()
def add_equations(self, m, var_dict):
locals().update(var_dict)
m.pythagoras = MyEqn(expression=a ** 2 + b ** 2 == c ** 2)
...
def add_other_equations_sometimes(self, m, var_dict):
locals().update(var_dict)
m.eqnname = MyEqn(expression=a + b == c)
...
但是在阅读了所有关于更新locals()的警告,并注意globals()会更新整个模块中的变量值,而不仅仅是类中的变量值之后,我不确定在数学表达式的变量中实现这种简单性的最佳方法是什么
目前没有回答
相关问题 更多 >
编程相关推荐