【问题标题】:can we distinguish string/int value in yaml file using yaml BaseLoader?我们可以使用 yaml BaseLoader 区分 yaml 文件中的字符串/int 值吗?
【发布时间】:2021-01-05 07:46:57
【问题描述】:

我有一个包含以下数据的 yaml 文件:

apple: 1
banana: '2'
cat: "3"

我的项目正在使用 Python(yaml.BaseLoader) 对其进行解析,并希望使用 isinstance() 推断 "apple" 与整数相关联?

但就我而言,isinstance(config['apple'], int) 的值显示为FALSE,而isinstance(config['apple'], str)TRUE

我认为这也是有道理的,因为我们正在使用 BaseLoader,所以有没有办法在不替换 BaseLoader 的情况下更新它以包含整数,因为项目的解析脚本在许多地方都得到了使用?

【问题讨论】:

  • 使用 BaseLoader 而不是为您执行此转换的加载器的原因是什么?

标签: python python-3.x yaml


【解决方案1】:

正如您所注意到的,基本加载器不区分标量类型(行为是通过BaseConstructor.construct_scalar)。

我不太确定这是否是您想要的,但是...

没有安全的方法(不会影响使用BaseLoader 的其他库)将整数添加到BaseLoader,但如果您愿意进行一次搜索和替换来替换@987654324 的使用@还有别的,你可以做

class OurLoader(BaseLoader):
    pass


OurLoader.add_constructor(
    "tag:yaml.org,2002:int", SafeConstructor.construct_yaml_int,
)

# Borrowed from the yaml module itself:

YAML_INT_RE = re.compile(
    r"""
    ^(?:[-+]?0b[0-1_]+
    |[-+]?0[0-7_]+
    |[-+]?(?:0|[1-9][0-9_]*)
    |[-+]?0x[0-9a-fA-F_]+
    |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$""",
    re.X,
)
OurLoader.add_implicit_resolver(
    "tag:yaml.org,2002:int", YAML_INT_RE, list("-+0123456789")
)

最终得到一个只知道整数但一无所知的加载器。

【讨论】:

  • 谢谢!我们可以重写construct_scalar() 来支持字符串和整数吗? @AKX
  • 您可以查看yaml/resolver.pyyaml/loader.py 了解如何添加这些解析器-构造器对。
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 2011-12-10
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多