modelx v0.27.0 (2024年8月25日)#

本次发布引入了以下功能增强和错误修复。

要将modelx更新至最新版本,请使用以下命令:

>>> pip install modelx --upgrade

Anaconda用户应改用conda命令:

>>> conda update modelx

功能增强#

未缓存单元格介绍#

Cells 类现在新增了一个属性 is_cached,用于指示单元格是否启用缓存。 将该属性设为 False 时,单元格将禁用缓存, 这意味着调用该单元格时不会缓存其返回值, 且每次调用时都会重新执行该单元格。

要创建一个非缓存的单元格, defcells() 函数现在包含一个 is_cached 参数, 用于指定是创建/更新缓存还是非缓存的单元格。

此外, uncached() 装饰器已被引入 作为 defcells(is_cached=False) 的别名。 该装饰器允许直接创建非缓存的单元格。 cached() 也被引入作为 defcells() 的别名。

import modelx as mx

@mx.cached
def cash_inflows():
    return [1, 2, 3]

@mx.cached
def cash_outflows():
    return [2, 1, 0]

@mx.uncached
def get_pv(cashflows: list):
    rate = 0.05
    disc = 1 / (1 + rate)
    return sum(v * disc**(i + 1) for i, v in enumerate(cashflows))

@mx.cached
def pv_inflows():
    return get_pv(cash_inflows())

@mx.cached
def pv_outflows():
    return get_pv(cash_outflows())

@mx.cached
def pv_netflows():
    return get_pv([i - o for i, o in zip(cash_inflows(), cash_outflows())])

print(f"pv_netflows(): {pv_netflows()}")
print(f"pv_inflows() - pv_outflows(): {pv_inflows() - pv_outflows()}")

在上面的例子中,get_pv被定义为一个非缓存的单元格, 这意味着它不会存储执行结果。 与缓存单元格不同,非缓存单元格可以接受不可哈希的参数, 比如列表,因为它们不需要使用参数作为键来存储结果。

如果没有未缓存的单元格get_pv,函数pv_inflowspv_outflowspv_netflows就需要重复相同的代码来计算各自现金流的现值:inflowsoutflowsnetflows

使用未缓存的单元格可以让您在单一位置定义被多个单元格共享的逻辑,减少代码重复并提高可维护性。

API变更

其他API变更#

  • 公式追踪消息现在最多显示20行追踪记录 (GH144)

Bug修复#

  • 在某种情况下继承功能无法正常工作 (GH138)

  • 在特定情况下继承功能无法正常工作 (GH141)