十进制数字 (Decimal)

StrictYAML 解析为表示十进制的 YAML 对象,而不是直接将值解析为十进制,以让你对可以对 YAML 执行的操作有更多灵活性和控制。

这就是该对象可以执行的操作 - 在许多情况下,如果解析为十进制,它将以相同的方式运行。

要获得 python decimal.Decimal 对象,请使用 .data。

解析和验证为 Decimal 最适合需要精度的值,例如价格。

示例 yaml_snippet

a: 1.00000000000000000001
b: 5.4135
from strictyaml import Map, Decimal, load
from decimal import Decimal as Dec
from ensure import Ensure

schema = Map({"a": Decimal(), "b": Decimal()})

.data 获取 Decimal 对象

Ensure(type(load(yaml_snippet, schema)["a"].data) is Dec).is_true()

有效

Ensure(load(yaml_snippet, schema)).equals({"a": Dec('1.00000000000000000001'), "b": Dec('5.4135')})

强制转换为 str

Ensure(str(load(yaml_snippet, schema)['a'])).equals("1.00000000000000000001")

强制转换为 float

Ensure(float(load(yaml_snippet, schema)["a"])).equals(1.0)

大于

Ensure(load(yaml_snippet, schema)["a"] > Dec('1.0')).is_true()

小于,这对于 float 来说是行不通的

Ensure(load(yaml_snippet, schema)["a"] < Dec('1.00000000000000000002')).is_true()

无法强制转换为 bool

bool(load(yaml_snippet, schema)['a'])
:
Cannot cast 'YAML(1.00000000000000000001)' to bool.
Use bool(yamlobj.data) or bool(yamlobj.text) instead.

无效

a: string
b: 2
load(yaml_snippet, schema)
strictyaml.exceptions.YAMLValidationError:
when expecting a decimal
found arbitrary text
  in "<unicode string>", line 1, column 1:
    a: string
     ^ (line: 1)