我认为这更像是一个警告;指导,让用户知道PyYAMLfuture 的最佳实践是什么.回想一下:Explicit is better than implicit.
在版本5.1(例如4.1)之前,yaml.load
api默认使用Loader=Loader
:
def load(stream, Loader=Loader):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
"""
loader = Loader(stream)
try:
return loader.get_single_data()
finally:
loader.dispose()
def safe_load(stream):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
Resolve only basic YAML tags.
"""
return load(stream, SafeLoader)
当时,Loader
class人只有三种 Select :有限的BaseLoader
人、SafeLoader
人和不安全的Loader
人.虽然默认的是不安全的,就像我们从文档中读到的:
PyYAML的load
函数自5月份首次发布以来一直不安全
但是仍然有很多资源和教程倾向于直接使用yaml.load(f)
,因此用户(尤其是新用户) Select 默认的加载程序类implicitly.
自PyYAML版本5.1以来,yaml.load
api更改为explicit:
def load(stream, Loader=None):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
"""
if Loader is None:
load_warning('load')
Loader = FullLoader
loader = Loader(stream)
try:
return loader.get_single_data()
finally:
loader.dispose()
def safe_load(stream):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
Resolve only basic YAML tags. This is known
to be safe for untrusted input.
"""
return load(stream, SafeLoader)
在Loader
classes中增加了一个新的FullLoader
.作为用户,我们也应该意识到这些变化,并多使用yaml.load
explicitly:
yaml.load(stream, yaml.SafeLoader)
建议用于不受信任的输入.限制:加载YAML语言的一个子集.
yaml.load(stream, yaml.FullLoader)
获取更可信的输入.还有一点限制:避免执行任意代码.
yaml.load(stream, yaml.Loader)
(UnsafeLoader
与Loader
相同)
不安全的但它拥有全部的力量.