La nueva versión de PyYAML se rompe en la mayoría de los objetos de Python personalizados – RepresenterError

Hace aproximadamente 5 horas, se lanzó la versión 4.1.0 . Está rompiendo mis pruebas unitarias. Aquí hay un MVCE limpio que muestra esto:

Versión 3.12:

 >>> import numpy as np >>> import yaml >>> x = np.int64(2) >>> yaml.dump(x, Dumper=yaml.Dumper) '!!python/object/apply:numpy.core.multiarray.scalar\n- !!python/object/apply:numpy.dtype\n args: [i8, 0, 1]\n state: !!python/tuple [3, <, null, null, null, -1, -1, 0]\n- !!binary |\n AgAAAAAAAAA=\n' 

Versión 4.1.0 :

 >>> import numpy as np >>> import yaml >>> x = np.int64(2) >>> yaml.dump(x, Dumper=yaml.Dumper) Traceback (most recent call last): File "", line 1, in  File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/__init__.py", line 217, in dump return dump_all([data], stream, Dumper=Dumper, **kwds) File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/__init__.py", line 196, in dump_all dumper.represent(data) File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/representer.py", line 26, in represent node = self.represent_data(data) File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/representer.py", line 57, in represent_data node = self.yaml_representers[None](self, data) File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/representer.py", line 229, in represent_undefined raise RepresenterError("cannot represent an object", data) yaml.representer.RepresenterError: ('cannot represent an object', 2) 

¿Hay alguna razón clara por la que PyYAML ya no admita estos tipos de objetos?

dump ahora es safe_dump , que no manejará objetos arbitrarios:

 >>> yaml.dump is yaml.safe_dump True 

Utilice danger_dump para el comportamiento anterior.

 >>> yaml.danger_dump(x) '!!python/object/apply:numpy.core.multiarray.scalar\n- !!python/object/apply:numpy.dtype\n args: [i8, 0, 1]\n state: !!python/tuple [3, <, null, null, null, -1, -1, 0]\n- !!binary |\n AgAAAAAAAAA=\n' 

Lo mismo ocurre con load / safe_load . No se pueden encontrar los documentos o las notas de la versión 4.1.0, solo lo descubrí a través de la confirmación ( aquí ).

¿Hay alguna razón clara por la que PyYAML ya no admita estos tipos de objetos?

Sí. yaml.load permitía la ejecución de código arbitrario, y una característica tan peligrosa debería ser solo una opción de yaml.load , no es posible usarla por accidente. Podría decirse que debería haber sido así desde el principio, y me alegro de que los nuevos mantenedores de PyYAML lo hayan corregido.