pyyaml 加载数字为十进制
Posted
技术标签:
【中文标题】pyyaml 加载数字为十进制【英文标题】:pyyaml load number as decimal 【发布时间】:2018-04-30 14:51:47 【问题描述】:yaml.load
在 Python 浮点数时加载数字。我找不到直接的方法来覆盖它。
比较json.load
,如果您想将浮点数解析为decimal.Decimal
s,则允许parse_float=Decimal
。
有什么方法可以用 PyYAML 完成这个吗?还是 YAML 规范的某些属性不建议这样做?
【问题讨论】:
【参考方案1】:你可以这样做:
def decimal_constructor(loader, node):
value = loader.construct_scalar(node)
return Decimal(value)
yaml.add_constructor(u'!decimal', decimal_constructor)
这允许您加载小数,但仅如果它们在 YAML 文档中以 !decimal
标记为前缀。但是,您可以使用自定义 Resolver
将所有数字解析为 !decimal
:
class MyResolver(BaseResolver):
pass
MyResolver.add_implicit_resolver(
'!decimal',
re.compile(r'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)?
|\.[0-9_]+(?:[eE][-+][0-9]+)?
|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*
|[-+]?\.(?:inf|Inf|INF)
|\.(?:nan|NaN|NAN))$''', re.X),
list('-+0123456789.'))
您应该从default resolver 复制其他隐式解析器。然后,您需要定义一个使用您的解析器的Loader
。
class MyLoader(Reader, Scanner, Parser, Composer, SafeConstructor, MyResolver):
def __init__(self, stream):
Reader.__init__(self, stream)
Scanner.__init__(self)
Parser.__init__(self)
Composer.__init__(self)
SafeConstructor.__init__(self)
MyResolver.__init__(self)
在上面,我们将您的构造函数添加到默认加载程序。将该行更改为:
yaml.add_constructor(u'!decimal', decimal_constructor, MyLoader)
最后,使用
加载 YAMLyaml.load(stream, MyLoader)
【讨论】:
有效!谢谢!工作概念证明:gist.github.com/jpassaro/4d5812290cdca51a8d3fe03c499d4149以上是关于pyyaml 加载数字为十进制的主要内容,如果未能解决你的问题,请参考以下文章
怎么在Word或者Excel里面把十进制的数字转换成二进制或者十六进制?
将 django 表单(formset)中的十进制数加载到数字输入中
使用 MMX 指令集计算 f(x)=2*(x^2)+5 饱和度,用于从二进制文件加载的 128 个大小为 2 字节的数字