【问题标题】:Creating Context from Model Python Variables从模型 Python 变量创建上下文
【发布时间】:2019-10-10 15:22:43
【问题描述】:

我正在使用

pyomo                     5.6.6                    py36_0    conda-forge

似乎AbstractModel Python 变量不能用于创建上下文。例如:

my_model = AbstractModel(name="Test")
# Create sets, parameters, variables
# ...
with my_model as m:
    # ...

给出错误:

AttributeError: __enter__

想知道我是否遗漏了什么,或者目前根本不可能。我希望通过上下文使我的代码更清晰。

【问题讨论】:

  • 不,Pyomo 不支持您尝试使用上下文执行的操作,但我不确定我是否理解您想要在上下文中使用 Pyomo 模型的动机,或者它如何制作您的代码清洁器。您只是想暂时重命名模型的 Python 变量吗?
  • 只是为了避免在一段代码中多次重复my_model。不过,这不是一个真正的问题。
  • 您可以执行m = my_model 之类的操作,然后在脚本的其余部分使用m

标签: python-3.x pyomo


【解决方案1】:

如果你使用with,Python 会计算这个表达式,对结果值调用 __enter__ 方法(称为“上下文保护”),然后分配任何 __enter__ 返回 as 给出的变量。然后 Python 将执行代码体,无论代码中发生什么,调用保护对象的 __exit__ 方法

因此,最好创建一个继承 AbstractModel 的新类,并在其中定义 enterexit 方法。

例如:

class NewAbstractModel(AbstractModel): 
   def __enter__(self, *args, **kwargs): 
       # do_something 
   def __exit__(self, *args, **kwargs): 
       # do_something

newmodel = NewAbstractModel(name="test")
with newmodel as m:
   # do_something with m

作为参考使用这个Understanding Python's "with" statement

【讨论】:

  • 谢谢,但我的问题是 Pyomo 是否在其模型中实现了对 with 语句的支持。
  • 不,如果您需要,他们不需要,那么您可以使用它,这取决于您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多