You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使unyt.unit_registry的修改作用于计算?自定义注册表问题

解决unyt库自定义/修改单位注册表的问题

问题1:自定义注册表的单位无法通过属性访问或直接在unyt模块调用

自定义注册表是字典类实例,本身不支持.式的属性访问(如my_registry.bushel),且自定义注册表中的单位不会自动挂载到unyt模块的命名空间,直接调用unyt.bushel会报错。

解决方法

获取自定义注册表中的Unit对象有两种可行方式:

  1. 显式通过unyt.Unit()指定目标注册表
  2. 用上下文管理器临时将自定义注册表设为默认

代码示例:

import unyt

# 创建自定义注册表并添加单位
my_registry = unyt.UnitRegistry()
unyt.define_unit('bushel', 0.5*unyt.kg, registry=my_registry)

# 方式1:显式指定注册表获取Unit对象
bushel_unit = unyt.Unit('bushel', registry=my_registry)
print(bushel_unit)  # 正常输出 bushel

# 方式2:临时切换默认注册表(仅上下文管理器内生效)
with unyt.UnitRegistry.set_default(my_registry):
    print(unyt.bushel)  # 可直接访问,输出 bushel

问题2:修改默认注册表后,unyt模块的单位属性未更新

unyt.bushel这类模块级单位属性是第一次访问时创建的单例对象,后续修改注册表不会自动刷新这个已生成的对象,因此你看到的还是旧的base_value。

解决方法

需要重新获取更新后的Unit对象,或者删除已存在的模块属性后重新访问:

代码示例:

import unyt

# 定义初始单位
unyt.define_unit('bushel', 0.5*unyt.kg)
print(unyt.bushel.base_value)  # 输出 0.5
print(unyt.unit_registry.default_unit_registry['bushel'])  # 输出 0.5

# 修改注册表中的单位
unyt.unit_registry.default_unit_registry.modify('bushel', 0.1*unyt.kg)
print(unyt.unit_registry.default_unit_registry['bushel'])  # 输出 0.1

# 方法1:直接从注册表重新获取Unit对象
updated_bushel = unyt.Unit('bushel')
print(updated_bushel.base_value)  # 输出 0.1

# 方法2:删除模块属性后重新访问
del unyt.bushel
print(unyt.bushel.base_value)  # 输出 0.1

内容的提问来源于stack exchange,提问作者Adam Cohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:23:10