python-3.x - astropy:如何检查参数是否具有正确的单位
问题描述
在 Python 中astropy
,我如何检查函数的参数不仅具有正确的单位,而且完全有单位?
我很熟悉is_equivalent()
,所以要检查它M
有质量单位,我可以说
assert M.unit.is_equivalent(u.g)
True
如果,说,它返回M = 1e12 * u.Msun
。但是如果M
根本没有任何单位——例如,如果我不小心通过了M = 1e12
——我会得到
AttributeError: 'Quantity' object has no '_normalize_equivalencies' member
一种方法是首先乘以M
eg ,如果它确实(u.m/u.m)
有一个单位,则它等于Unit(dimensionless)
并且不会改变,同时它将一个类似的数字转换为然后可以检查而不会给出错误的数字。M
1e12
<Quantity 1.e+12>
不过,这似乎不是正确的方法。有没有更好的办法?
解决方案
如评论中所述,如果您的目标是专门检查函数参数的单位,则可以使用quantity_input
专门用于此目的的实用程序装饰器(并将根据需要引发ValueError
or TypeError
or or UnitsError
,这通常是无效函数的更合适的例外论点比裸露的AssertionError
)。
我特别喜欢使用函数注释的 Python 3 特定语法。这里有些例子:
>>> from astropy import units as u
>>> @u.quantity_input
... def my_function(M: u.g):
... print(M)
正确单位:
>>> my_function(1e12*u.Msun)
1000000000000.0 solMass
>>> my_function(1e12*u.g)
1000000000000.0 g
参数不正确的例子:
>>> my_function(1e12)
Traceback (most recent call last)
...
TypeError: Argument 'M' to function 'my_function' has no 'unit' attribute. You may want to pass in an astropy Quantity instead.
>>> my_function(1e12*u.dimensionless_unscaled)
Traceback (most recent call last)
...
UnitsError: Argument 'M' to function 'my_function' must be in units convertible to 'g'.
如果您有许多函数M
作为参数必须具有质量单位,您还可以为其创建简写,例如:
>>> M_mass = u.quantity_input(M=u.g)
>>> @M_mass
... def my_function(M):
... print(M)
相同的方法可用于不同单元中的多个参数的函数。
推荐阅读
- c# - 模拟错误的执行多重响应
- try-catch-finally - 为什么finally块存在?
- c++ - 接口的菱形继承 (C++)
- c# - 如何确定为什么 .editorconfig 中的某些设置未应用?
- sql - 浮动百分比
- sql - 在多个连接记录中进行 SQL 字符串搜索
- swift - 如何创建collectionview header,如搜索一个instagram标签?
- node.js - 基于目标客户端与服务器代码的不同构建
- python - 配置两个远程系统之间的路径映射以使断点在 PyDev 中工作
- ruby-on-rails - Rails ActionView::Template::Error undefined method `count' 解析器