Python 我们可以使用yaml BaseLoader区分yaml文件中的string/int值吗?

Python 我们可以使用yaml BaseLoader区分yaml文件中的string/int值吗?,python,python-3.x,yaml,Python,Python 3.x,Yaml,我有一个包含以下数据的yaml文件: apple: 1 banana: '2' cat: "3" 我的项目正在使用Python(yaml.BaseLoader)对其进行解析,并希望使用isinstance()推断出“apple”与一个整数相关联 但是在我的例子中,值isinstance(config['apple'],int)显示为FALSE,而isinstance(config['apple'],str)显示为TRUE 我认为这也是有意义的,因为我们使用的是BaseLoa

我有一个包含以下数据的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不区分标量类型(行为是通过
BaseConstructor.construct\u scalar

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

没有安全的方法(这不会影响使用
BaseLoader
的其他库)将整数添加到
BaseLoader
,但是如果您愿意执行单个搜索和替换,以其他方式替换
BaseLoader
,您可以这样做

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")
)

以只知道整数的加载程序结束。

使用BaseLoader而不是为您执行此转换的加载程序的原因是什么?谢谢!我们可以重写构造\u scalar()吗要同时支持字符串和整数?@AKXYou可以查看
yaml/resolver.py
yaml/loader.py
以了解如何添加这些解析器构造函数对。