如何使unyt.unit_registry的修改作用于计算?自定义注册表问题
解决unyt库自定义/修改单位注册表的问题
问题1:自定义注册表的单位无法通过属性访问或直接在unyt模块调用
自定义注册表是字典类实例,本身不支持.式的属性访问(如my_registry.bushel),且自定义注册表中的单位不会自动挂载到unyt模块的命名空间,直接调用unyt.bushel会报错。
解决方法
获取自定义注册表中的Unit对象有两种可行方式:
- 显式通过
unyt.Unit()指定目标注册表 - 用上下文管理器临时将自定义注册表设为默认
代码示例:
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
相关产品推荐
相关产品推荐

