id,summary,reporter,owner,description,type,status,priority,component,severity,resolution,keywords,cc
245,support for Abstract Base Classes,alex.garel@…,xi,"== problem ==

{{{

>>> import yaml
>>> from collections import Mapping
>>> class A(Mapping):
...     pass
... 
>>> yaml.dump(A)
Traceback (most recent call last):
  File ""<stdin>"", line 1, in <module>
  File ""/tmp/yaml/lib/python2.7/site-packages/yaml/__init__.py"", line 202, in dump
    return dump_all([data], stream, Dumper=Dumper, **kwds)
  File ""/tmp/yaml/lib/python2.7/site-packages/yaml/__init__.py"", line 190, in dump_all
    dumper.represent(data)
  File ""/tmp/yaml/lib/python2.7/site-packages/yaml/representer.py"", line 28, in represent
    node = self.represent_data(data)
  File ""/tmp/yaml/lib/python2.7/site-packages/yaml/representer.py"", line 61, in represent_data
    node = self.yaml_multi_representers[data_type](self, data)
  File ""/tmp/yaml/lib/python2.7/site-packages/yaml/representer.py"", line 408, in represent_object
    reduce = data.__reduce_ex__(2)
  File ""/tmp/yaml/lib/python2.7/copy_reg.py"", line 70, in _reduce_ex
    raise TypeError, ""can't pickle %s objects"" % base.__name__
TypeError: can't pickle int objects
}}}

== analysis ==

This is because of A being handled as an object, so an unbind version {{{ object.__reduce_ex__ }}} is called, so protocol version is mistaken with the object (2 is passed in place of self).

{{{

>>> type(A)
<class 'abc.ABCMeta'>

}}}

== solution ==

{{{

>>> from yaml.representer import Representer
>>> from abc import ABCMeta
>>> Representer.add_representer(ABCMeta, Representer.represent_name)
>>> yaml.dump(A)
""!!python/name:__main__.A ''\n""


}}}",defect,new,normal,pyyaml,major,,Abstract Base Class ABC,
