将变量引入python函数名称空间

时间:2016-05-06 03:45:01

标签: python scope

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

0 个答案:

没有答案