En pyyaml, SafeLoader no incluye un cargador para los tipos nativos de python, solo los tipos definidos en la especificación yaml. Puede ver los tipos para SafeLoader
y Loader
aquí en el ejemplo de interacción a continuación.
se puede definir una nueva clase Loader que se suma en la tupla Python, pero no otros tipos, por lo que aún debe ser bastante segura:
import yaml
class PrettySafeLoader(yaml.SafeLoader):
def construct_python_tuple(self, node):
return tuple(self.construct_sequence(node))
PrettySafeLoader.add_constructor(
u'tag:yaml.org,2002:python/tuple',
PrettySafeLoader.construct_python_tuple)
doc = yaml.dump(tuple("foo bar baaz".split()))
print repr(doc)
thing = yaml.load(doc, Loader=PrettySafeLoader)
print thing
lo que resulta en:
'!!python/tuple [foo, bar, baaz]\n'
('foo', 'bar', 'baaz')
continuación, se muestran para los constructores asociados con las clases SafeLoader y Loader.
>>> yaml.SafeLoader.yaml_constructors
{None: <unbound method SafeConstructor.construct_undefined>,
u'tag:yaml.org,2002:binary': <unbound method SafeConstructor.construct_yaml_binary>,
u'tag:yaml.org,2002:bool': <unbound method SafeConstructor.construct_yaml_bool>,
u'tag:yaml.org,2002:float': <unbound method SafeConstructor.construct_yaml_float>,
u'tag:yaml.org,2002:int': <unbound method SafeConstructor.construct_yaml_int>,
u'tag:yaml.org,2002:map': <unbound method SafeConstructor.construct_yaml_map>,
u'tag:yaml.org,2002:null': <unbound method SafeConstructor.construct_yaml_null>,
u'tag:yaml.org,2002:omap': <unbound method SafeConstructor.construct_yaml_omap>,
u'tag:yaml.org,2002:pairs': <unbound method SafeConstructor.construct_yaml_pairs>,
u'tag:yaml.org,2002:seq': <unbound method SafeConstructor.construct_yaml_seq>,
u'tag:yaml.org,2002:set': <unbound method SafeConstructor.construct_yaml_set>,
u'tag:yaml.org,2002:str': <unbound method SafeConstructor.construct_yaml_str>,
u'tag:yaml.org,2002:timestamp': <unbound method SafeConstructor.construct_yaml_timestamp>}
>>> yaml.Loader.yaml_constructors
{None: <unbound method SafeConstructor.construct_undefined>,
u'tag:yaml.org,2002:binary': <unbound method SafeConstructor.construct_yaml_binary>,
u'tag:yaml.org,2002:bool': <unbound method SafeConstructor.construct_yaml_bool>,
u'tag:yaml.org,2002:float': <unbound method SafeConstructor.construct_yaml_float>,
u'tag:yaml.org,2002:int': <unbound method SafeConstructor.construct_yaml_int>,
u'tag:yaml.org,2002:map': <unbound method SafeConstructor.construct_yaml_map>,
u'tag:yaml.org,2002:null': <unbound method SafeConstructor.construct_yaml_null>,
u'tag:yaml.org,2002:omap': <unbound method SafeConstructor.construct_yaml_omap>,
u'tag:yaml.org,2002:pairs': <unbound method SafeConstructor.construct_yaml_pairs>,
u'tag:yaml.org,2002:python/bool': <unbound method Constructor.construct_yaml_bool>,
u'tag:yaml.org,2002:python/complex': <unbound method Constructor.construct_python_complex>,
u'tag:yaml.org,2002:python/dict': <unbound method Constructor.construct_yaml_map>,
u'tag:yaml.org,2002:python/float': <unbound method Constructor.construct_yaml_float>,
u'tag:yaml.org,2002:python/int': <unbound method Constructor.construct_yaml_int>,
u'tag:yaml.org,2002:python/list': <unbound method Constructor.construct_yaml_seq>,
u'tag:yaml.org,2002:python/long': <unbound method Constructor.construct_python_long>,
u'tag:yaml.org,2002:python/none': <unbound method Constructor.construct_yaml_null>,
u'tag:yaml.org,2002:python/str': <unbound method Constructor.construct_python_str>,
u'tag:yaml.org,2002:python/tuple': <unbound method Constructor.construct_python_tuple>,
u'tag:yaml.org,2002:python/unicode': <unbound method Constructor.construct_python_unicode>,
u'tag:yaml.org,2002:seq': <unbound method SafeConstructor.construct_yaml_seq>,
u'tag:yaml.org,2002:set': <unbound method SafeConstructor.construct_yaml_set>,
u'tag:yaml.org,2002:str': <unbound method SafeConstructor.construct_yaml_str>,
u'tag:yaml.org,2002:timestamp': <unbound method SafeConstructor.construct_yaml_timestamp>}
Eso tiene perfecto sentido. ¡Muchas gracias! – blz