python对象的数字特征
numtraits的Python项目详细描述
请注意:此包是实验性的,可能仍会看到一些 对api的更改。如果你对改进api有什么建议, 请打开一个问题!
关于
这个简单的模块定义了一个描述符类,可以用来定义 类和上的数值性质(标量和n维数组) 提供一种验证方法。因此,与其写东西 例如:
classSphere(object):@propertydefradius(self):returnself._radius@radius.setterdefradius(self,value):ifvalue<=0:raiseValueError("Value should be strictly positive")ifnotnp.isscalar(value):raiseTypeError("Value should be a scalar")ifnotnp.isreal(value):raiseTypeError("Value should be numerical")self._radius=value
对于要定义的每个属性,您只需执行以下操作:
fromnumtraitsimportNumericalTraitfromtraitletsimportHasTraitsclassSphere(HasTraits):radius=NumericalTrait(domain='strictly-positive',ndim=0)
NumericalTrait类是在 traitlets模块。任何类别 使用NumericalTrait定义属性必须 从traitlets.HasTraits类派生。
还包括用于检查尺寸和形状的支架 数组(包括将元组和列表转换为数组 以及检查 astropy.units, pint,和 quantities单元框架。
安装
这个包与Python2.7、3.3和更高版本兼容,并且需要 numpy和 traitlets。如果你是 有兴趣进行单元验证,您还需要 astropy, pint,或 quantities,取决于 你通常使用哪个单元框架。
要安装,您可以执行以下操作:
pip install numtraits
如果需要,还可以将numtraits.py捆绑到包中 避免使用外部依赖项,但请确保 文件中的版权和许可证。
使用
若要在类上创建自验证的数值属性,请使用 NumericalTrait类:
fromtraitletsimportHasTraitsfromnumtraitsimportNumericalTraitclassSphere(HasTraits):radius=NumericalTrait(domain='strictly-positive',ndim=0)position=NumericalTrait(shape=(3,))
设置属性时,将验证它:
>>>s=Sphere()>>>s.radius=1.>>>s.radius=-3...TraitError:radiusshouldbestrictlypositive>>>s.radius=[1,2]...TraitError:radiusshouldbeascalarvalue>>>s.position=(1,2,3)>>>s.position=3...TraitError:positionshouldbea1-dsequence>>>s.position=(1,2,3,4)...TraitError:positionhasincorrectlength(expected3butfound4)
NumericalTrait的以下参数可用:
- ndim:将值限制为具有此维数的数组
- shape:将值限制为具有此形状的数组。如果 指定的,ndim不需要给定。
- domain:将值限制为特定域-可以是一个 共positive,strictly-positive,negative, strictly-negative,或表示一系列值的元组。
- default:要返回的默认值(如果未指定)(默认值 到None)
- convertible_to:将值限制为具有 可转换为一组特定的单元(参见下面的章节)
注意元组和列表将自动转换为numpy 数组,如果它们被认为是有效的。
物理单位
虽然NumericalTrait可以用于普通标量和numpy数组, 它也可以用于标量和具有相关单位的数组, 支持三种常用的单元处理单元: astropy.units, pint,和 quantities。
将NumericalTrait限制为具有特定类型 单位,使用convertible_to选项。此选项从 这三个单元包中的任何一个,并将确保传递的任何值 单位等于(但不一定等于)指定的 convertible_to选项。
如果传递给convertible_to的单位是 astropy.units单位,然后是任意 传递给属性的值应该是 astropy.units数量。如果 传递给convertible_to的单元是 pint单位,则任何传递的数量 属性应该是pint 财产。最后,如果传递给convertible_to的单元是 quantities单位,然后是任意 传递给属性的数量应为 quantities数量。
astropy.units数量示例
下面的示例演示如何将radius属性限制为 成为astropy.units数量 长度单位:
fromastropyimportunitsasuclassSphere(HasTraits):radius=NumericalTrait(convertible_to=u.m)
然后将执行以下操作:
>>>s=Sphere()>>>s.radius=3.*u.m>>>s.radius=4.*u.cm>>>s.radius=4.*u.s...TraitError:radiusshouldbeinunitsconvertibletom
品脱数量示例
下面的示例演示如何将radius属性限制为 是一个pint数量,单位为 长度:
frompintimportUnitRegistryureg=UnitRegistry()classSphere(HasTraits):radius=NumericalTrait(convertible_to=ureg.m)
然后将执行以下操作:
>>>s=Sphere()>>>s.radius=3.*ureg.m>>>s.radius=4.*ureg.cm>>>s.radius=4.*ureg.s...TraitError:radiusshouldbeinunitsconvertibletometer
数量数量示例
最后,下面的示例演示如何限制radius 属性为quantities 数量(单位:Le)长度:
importquantitiesaspqclassSphere(HasTraits):radius=NumericalTrait(convertible_to=pq.m)
然后将执行以下操作:
>>>s=Sphere()>>>s.radius=3.*pq.m>>>s.radius=4.*pq.cm>>>s.radius=4.*pq.s...TraitError:radiusshouldbeinunitsconvertibletom
计划支持
- 属性的链接(例如,属性应该具有相同的 其他尺寸)