U #IGZ@sddlmZmZmZddlZddlmZddlmZm Z m Z ddl m Z dde dfd d Zddedfd d Zd dZddZddZdS))absolute_importdivisionprint_functionN) iteritems)NOTHING _obj_setattrfields)AttrsAttributeNotFoundErrorTFc st|j}}|D]}t||j}dk r8||s8q|dkrt|jrbt|dd||j<qt|ttt fr|dkr|jnt} | fdd|D||j<qt|t rԈfddt |D||j<q|||j<q|||j<q|S)a Return the ``attrs`` attribute values of *inst* as a dict. Optionally recurse into other ``attrs``-decorated classes. :param inst: Instance of an ``attrs``-decorated class. :param bool recurse: Recurse into classes that are also ``attrs``-decorated. :param callable filter: A callable whose return code determines whether an attribute or element is included (``True``) or dropped (``False``). Is called with the :class:`attr.Attribute` as the first argument and the value as the second argument. :param callable dict_factory: A callable to produce dictionaries from. For example, to produce ordered dictionaries instead of normal Python dictionaries, pass in ``collections.OrderedDict``. :param bool retain_collection_types: Do not convert to ``list`` when encountering an attribute whose type is ``tuple`` or ``set``. Only meaningful if ``recurse`` is ``True``. :rtype: return type of *dict_factory* :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` class. .. versionadded:: 16.0.0 *dict_factory* .. versionadded:: 16.1.0 *retain_collection_types* NTrecursefilter dict_factorycs*g|]"}t|jr"t|ddn|qS)Tr has __class__asdict).0i)rr /_funcs.py 3s  zasdict..c3sF|]>\}}t|jr t|dn|t|jr8t|dn|fVqdS))rNrrZkkZvv)dfrr ;szasdict..) r rgetattrnamerr isinstancetuplelistsetdictr) instr r rretain_collection_typesattrsrvavcfr)rrr rr s0       rc st|j}g}||D]}t||j}dk r:||s:q|dkrt|jrf|t|ddnt|tt t frdkr|jnt } || fdd|DnJt|t rdkr|jnt } || fddt |Dn ||q||qt kr|S|S)a8 Return the ``attrs`` attribute values of *inst* as a tuple. Optionally recurse into other ``attrs``-decorated classes. :param inst: Instance of an ``attrs``-decorated class. :param bool recurse: Recurse into classes that are also ``attrs``-decorated. :param callable filter: A callable whose return code determines whether an attribute or element is included (``True``) or dropped (``False``). Is called with the :class:`attr.Attribute` as the first argument and the value as the second argument. :param callable tuple_factory: A callable to produce tuples from. For example, to produce lists instead of tuples. :param bool retain_collection_types: Do not convert to ``list`` or ``dict`` when encountering an attribute which type is ``tuple``, ``dict`` or ``set``. Only meaningful if ``recurse`` is ``True``. :rtype: return type of *tuple_factory* :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` class. .. versionadded:: 16.2.0 NTr r tuple_factoryr#c s,g|]$}t|jr$t|ddn|qS)Tr)rrastuple)rjr retainr*rrrps zastuple..c3sJ|]B\}}t|jr"t|dn|t|jr.) r rrrrappendr,rrrr r!r) r"r r r*r#r$r%r&r'r(rrr.rr,Fs4           r,cCst|dddk S)z Check whether *cls* is a class with ``attrs`` attributes. :param type cls: Class to introspect. :raise TypeError: If *cls* is not a class. :rtype: :class:`bool` Z__attrs_attrs__N)r)clsrrrrs rcKsvddl}|jdtddt|}t|j}t|D]<\}}t||t}|tkrdt dj ||jdt |||q4|S)a Copy *inst* and apply *changes*. :param inst: Instance of a class with ``attrs`` attributes. :param changes: Keyword changes in the new copy. :return: A copy of inst with *changes* incorporated. :raise attr.exceptions.AttrsAttributeNotFoundError: If *attr_name* couldn't be found on *cls*. :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` class. .. deprecated:: 17.1.0 Use :func:`evolve` instead. rNz6assoc is deprecated and will be removed after 2018/01.) stacklevelz&{k} is not an attrs attribute on {cl}.)kZcl) warningswarnDeprecationWarningcopyr rrrrr formatr)r"changesr5newr$r4r'r&rrrassocs$   r<cKsb|j}t|}|D]D}|jsq|j}|ddkr4|n |dd}||krt||||<q|f|S)a Create a new instance, based on *inst* with *changes* applied. :param inst: Instance of a class with ``attrs`` attributes. :param changes: Keyword changes in the new copy. :return: A copy of inst with *changes* incorporated. :raise TypeError: If *attr_name* couldn't be found in the class ``__init__``. :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` class. .. versionadded:: 17.1.0 r_rN)rr Zinitrr)r"r:r1r$r&Z attr_nameZ init_namerrrevolvesr>)Z __future__rrrr8Z_compatr_makerrr exceptionsr r!rrr,rr<r>rrrrs   < H !