Python 我们可以使用yaml BaseLoader区分yaml文件中的string/int值吗?
我有一个包含以下数据的yaml文件: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
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
以了解如何添加这些解析器构造函数对。