为啥品脱要创建第二个注册表?

Posted

技术标签:

【中文标题】为啥品脱要创建第二个注册表?【英文标题】:Why is Pint creating a second registry?为什么品脱要创建第二个注册表? 【发布时间】:2021-09-03 15:02:27 【问题描述】:

我不断收到“无法使用不同注册表的数量和数量进行操作”。错误,我不知道为什么。在下面的代码 sn-p 中,Pint 创建了一个用于填充常量/流体字典的注册表。当我从数字数据创建 DataFrame 时,Pint 使用不同的注册表......我不知道为什么。

抱歉,MWE 有点长。底部的循环/方程式是引发错误的原因,但我添加了一些打印语句来检查单元注册表,它们确实不同...帮助?

编辑:如果我重新启动内核 Pint 只使用一个注册表。但是在任何后续运行中,即使我清除了变量,我也会得到两个不同的注册表。我不确定这是否对任何人都有帮助,但这是更多信息。我希望程序只使用一个注册表,即使我在同一个内核中多次运行它....

from __future__ import print_function, absolute_import, division
import pandas as pd
import pint # Units
import pint_pandas as ppi

# Unit Registry
ureg = pint.UnitRegistry(auto_reduce_dimensions=False)
pint.set_application_registry(ureg)
ppi.PintType.ureg = ureg
ppi.PintType.ureg.default_format = "~P"

# Constants and Parameters
#Acceleration Due to Gravity
g = 1.0 * ureg.g_0
g.ito(ureg.foot / ureg.second**2 ) # ft/s2

print('Constants Dictionary Unit Registries')
print('g: ', id(g._REGISTRY))

# Constants Dict
const_dict = 
const_dict['g'] = g
const_dict['SL_LB'] = 1.0*ureg.slug/(1.0*ureg.slug).to(ureg.pound) # slug/lb
const_dict['rho'] = 68.48 * ureg.pound / ureg.foot**3  #lbMass/ft^3
const_dict['eta'] = 0.6644 * ureg.centipoise

# Check registry of constants dictionary
cdg = const_dict['g']
print('cdg: ', id(cdg._REGISTRY))

# Fluid Dict
fluid_dict = 
fluid_dict['Dens_SL'] = const_dict['rho'] * const_dict['SL_LB'] # slugs/ft3
fluid_dict['DynVisc_LBFT2'] = const_dict['eta'].to(ureg.force_pound * ureg.second / ureg.foot**2) #lbF-s/ft2

# Check registry of fluid dictionary
fdex = fluid_dict['Dens_SL']
print('Fluid Dictionary Unit Registries')
print('fdex: ', id(fdex._REGISTRY))

# Small segment of the input data
Dij = [4.0]*4
Lij = [2000.0]*4
data = 'Dij': Dij, 'Lij': Lij
arc = pd.DataFrame(data=data)

# Put Data into DataFrame
df = pd.DataFrame(
        "Dij": ppi.PintArray(arc['Dij'], dtype=ureg.inch),
        "Lij": ppi.PintArray(arc['Lij'], dtype=ureg.foot)
    , index=arc.index)

print('DataFrame Unit Registries')
ID = df.at[0,'Dij']
print('ID: ', id(ID._REGISTRY))

v = list(range(1,3))
vels = ppi.PintArray(v, dtype=ureg.foot/ureg.second)

# Check registry of Pint Array content
vt=vels[0]
print('V: ', id(vt._REGISTRY))

vvels = [vels]*len(arc)
vv = list(zip(arc.index.values, vvels))
vd = dict(vv)
pwdf = pd.DataFrame(vd, index=v)
pwdf2 = pwdf.T

# Breaks here....
#for y in vels:
#    ReNumb = y * ID * fluid_dict['Dens_SL'] / fluid_dict['DynVisc_LBFT2']
#    ReNumb.ito_reduced_units()
#    print(ReNumb)

创建以下输出:

Constants Dictionary Unit Registries
g:  140211922283536
cdg:  140211922283536
Fluid Dictionary Unit Registries
fdex:  140211922283536
DataFrame Unit Registries
ID:  140211870589664
V:  140211870589664

很明显,实际的注册表 NUMBERS 有时会在代码执行之间发生变化,但归根结底,前三个总是与后两个不同...

【问题讨论】:

【参考方案1】:

显然,如果我使用 get_application_registry 而不是 set_application_registry,它可以正常工作。我真的不明白为什么,因为 Pint 网站上的示例是:

from pint import UnitRegistry, set_application_registry
ureg = UnitRegistry()
set_application_registry(ureg)

但是,“set”对我不起作用……我需要使用“get”。

ureg = pint.get_application_registry()

【讨论】:

以上是关于为啥品脱要创建第二个注册表?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 unwind segue 回退太远了?

一个手机号怎么申请第二个微信号?

SQL 最近从第二个表注册的 Id

在 iOS (swift) 应用中,第二个 Firebase 应用的注册无法接收远程通知

浮动不工作,第二个背景图像没有注册为背景,居中的东西?

ASP.NET MVC5 在用户注册时自动填充第二个表