在python函数namesp中引入变量

2024-09-30 06:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我正在尝试构建一个模型对象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()会更新整个模块中的变量值,而不仅仅是类中的变量值之后,我不确定在数学表达式的变量中实现这种简单性的最佳方法是什么


Tags: selfaddifvardefvariablesdictother

热门问题