modelx v0.10.0 (2020年9月17日)#

本次发布引入了以下改进和变更。

功能增强#

引用模式介绍

引用现在具有引用模式属性,用于控制当它们的派生引用值是核心modelx对象(如空间或单元格)时,如何确定这些值。 引用模式属性可以设置为"absolute"(绝对)、"relative"(相对)或"auto"(自动)。以下方法通过明确指定引用模式来设置引用。

当引用处于绝对模式时,其派生的引用会绑定到与基础引用相同的对象。

当引用处于相对模式时,其派生引用会绑定到一个对象,该对象与派生引用的相对位置,与基础引用所引用的对象相对于基础引用的相对位置保持一致。若不存在这样的值,则会引发错误。

当引用处于自动模式时,其派生的引用会尽可能采用相对绑定方式,在无法实现时则采用绝对绑定。

示例说明

在下图中,A 是一个用户空间, BA 的子用户空间,而 fooB 的子单元格。

以下代码将bar定义为B中对foo绝对引用:

>>> B.absref(bar=B.foo)
../_images/sample1_base.png

当从B派生出一个新的用户空间D时,D中的派生引用bar会绑定到B中的foo

>>> D.bar
<Cells foo(x) in Model1.B>
../_images/sample1_absref.png

或者,barB中可以定义为如下所示的相对引用:

>>> B.relref(bar=B.foo)

在这种情况下,D中的派生引用bar绑定到了D中的foo

>>> D.bar
<Cells foo(x) in Model1.D>
../_images/sample1_relref.png

或者,barB 中可以通过赋值操作定义为 自动 引用:

>>> B.bar = B.foo

由于支持相对引用,D.bar被绑定到D.foo

>>> D.bar
<Cells foo(x) in Model1.D>

在下一个示例中,B.bar只能在绝对模式或自动模式下绑定到A。尝试在相对模式下将B.bar绑定到A会引发错误,因为A不在源自B的树结构中,且不存在与D.bar对应的对象:

>>> B.absref(bar=B.foo)     # in absolute mode, or

>>> B.bar = B.foo           # in auto mode
../_images/sample2_base.png

在任一模式下,D.bar 都绑定到 A

>>> D.bar
<UserSpace A in Model1>
../_images/sample2_absref.png

向后不兼容的变更#

在此版本之前,所有引用都处于绝对模式。 现在,引用赋值操作以自动模式分配modelx对象,当存在相对引用可能时,这可能导致某些引用被绑定到非预期的对象。这些引用现在需要通过UserSpace.absref()UserSpace.set_ref()显式设置为绝对引用。

Bug修复#

  • 修复了一个bug:当未被修改时,由ExcelRange引用的Excel文件未被保存。