浮点数 (Float)

StrictYAML 解析为表示十进制的 YAML 对象 - 例如 YAML(1.0000000000000001)

要获取 Python 浮点数文字,请使用 .data。

解析和验证为 Decimal 最适合需要精度的值,但 float 更适合不需要精度的值。

示例 yaml_snippet

a: 1.00000000000000000001
b: 5.4135
from math import isnan, isinf

from strictyaml import Map, MapPattern, Str, Float, Bool, load, as_document
from collections import OrderedDict
from ensure import Ensure

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

使用 .data 获取 float 类型

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

等于等效浮点数,但数字不同

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

强制转换为 str

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

强制转换为 float

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

大于

Ensure(load(yaml_snippet, schema)["a"] > 0).is_true()

小于

Ensure(load(yaml_snippet, schema)["a"] < 0).is_false()

具有 NaN 值

a: nan
b: .NaN
Ensure(isnan(load(yaml_snippet, schema)["a"].data)).is_true()
Ensure(isnan(load(yaml_snippet, schema)["b"].data)).is_true()

具有无穷大值

a: -.Inf
b: INF
Ensure(isinf(load(yaml_snippet, schema)["a"].data)).is_true()
Ensure(isinf(load(yaml_snippet, schema)["b"].data)).is_true()

具有下划线

a: 10_000_000.5
b: 10_0_0.2_5
Ensure(load(yaml_snippet, schema).data).equals({"a": 10000000.5, "b": 1000.25})

不能强制转换为 bool

bool(load(yaml_snippet, schema)['a'])
:
Cannot cast 'YAML(1.0)' 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 float
found arbitrary text
  in "<unicode string>", line 1, column 1:
    a: string
     ^ (line: 1)

成功序列化

print(as_document(OrderedDict([("a", 3.5), ("b", "2.1")]), schema).as_yaml())
a: 3.5
b: 2.1

使用 NaN 成功序列化

print(as_document(OrderedDict([("a", 3.5), ("b", float("nan"))]), schema).as_yaml())
a: 3.5
b: nan

使用无穷大成功序列化

print(as_document(OrderedDict([("a", float("inf")), ("b", float("-inf"))]), schema).as_yaml())
a: inf
b: -inf

序列化失败

as_document(OrderedDict([("a", "x"), ("b", "2.1")]), schema)
strictyaml.exceptions.YAMLSerializationError:
when expecting a float, got 'x'

浮点数作为键

document = as_document(OrderedDict([("3.5", "a"), ("2.1", "c")]), MapPattern(Float(), Str()))
print(document.data[3.5])
print(document.data[2.1])
a
c

浮点数或布尔值

document = as_document({"a": True}, Map({"a": Float() | Bool()}))
print(document.as_yaml())
a: yes

可执行规范

float.story storytests 自动生成的文档。