o znh7@s2dZddlZddlmZddlmZddlmZddlmZddlmZdd lmZdd l m Z dd l m Z d d Z edZ GdddejZGdddeZGdddeZGdddeZGddde eZGdddeZGdddeZGdddeZedZGd d!d!eZGd"d#d#eZdS)$zContain the ``AssociationProxy`` class. The ``AssociationProxy`` is a Python property object which provides transparent proxied access to the endpoint of an association object. See the example ``examples/association/proxied_association.py``. N)exc)inspect)orm)util) collections) interfaces)or_)ColumnOperatorscKst||fi|S)aReturn a Python property implementing a view of a target attribute which references an attribute on members of the target. The returned value is an instance of :class:`.AssociationProxy`. Implements a Python property representing a relationship as a collection of simpler values, or a scalar value. The proxied property will mimic the collection type of the target (list, dict or set), or, in the case of a one to one relationship, a simple scalar value. :param target_collection: Name of the attribute we'll proxy to. This attribute is typically mapped by :func:`~sqlalchemy.orm.relationship` to link to a target collection, but can also be a many-to-one or non-scalar relationship. :param attr: Attribute on the associated instance or instances we'll proxy for. For example, given a target collection of [obj1, obj2], a list created by this proxy property would look like [getattr(obj1, *attr*), getattr(obj2, *attr*)] If the relationship is one-to-one or otherwise uselist=False, then simply: getattr(obj, *attr*) :param creator: optional. When new items are added to this proxied collection, new instances of the class collected by the target collection will be created. For list and set collections, the target class constructor will be called with the 'value' for the new instance. For dict types, two arguments are passed: key and value. If you want to construct instances differently, supply a *creator* function that takes arguments as above and returns instances. For scalar relationships, creator() will be called if the target is None. If the target is present, set operations are proxied to setattr() on the associated object. If you have an associated object with multiple attributes, you may set up multiple association proxies mapping to different attributes. See the unit tests for examples, and for examples of how creator() functions can be used to construct the scalar relationship on-demand in this situation. :param \*\*kw: Passes along any other keyword arguments to :class:`.AssociationProxy`. )AssociationProxy)target_collectionattrkwrJ/usr/local/lib/python3.10/dist-packages/sqlalchemy/ext/associationproxy.pyassociation_proxys4rASSOCIATION_PROXYc@speZdZdZdZeZ      dddZddZd d Z d d Z dd dZ ddZ ddZ ddZddZdS)r zDA descriptor that presents a read/write view of an object attribute.TNFc CsV||_||_||_||_||_||_||_dt|j|t |f|_ |r)||_ dSdS)a Construct a new :class:`.AssociationProxy`. The :func:`.association_proxy` function is provided as the usual entrypoint here, though :class:`.AssociationProxy` can be instantiated and/or subclassed directly. :param target_collection: Name of the collection we'll proxy to, usually created with :func:`.relationship`. :param attr: Attribute on the collected instances we'll proxy for. For example, given a target collection of [obj1, obj2], a list created by this proxy property would look like [getattr(obj1, attr), getattr(obj2, attr)] :param creator: Optional. When new items are added to this proxied collection, new instances of the class collected by the target collection will be created. For list and set collections, the target class constructor will be called with the 'value' for the new instance. For dict types, two arguments are passed: key and value. If you want to construct instances differently, supply a 'creator' function that takes arguments as above and returns instances. :param cascade_scalar_deletes: when True, indicates that setting the proxied value to ``None``, or deleting it via ``del``, should also remove the source object. Only applies to scalar attributes. Normally, removing the proxied target will not remove the proxy source, as this object may have other state that is still to be kept. .. versionadded:: 1.3 .. seealso:: :ref:`cascade_scalar_deletes` - complete usage example :param getset_factory: Optional. Proxied attribute access is automatically handled by routines that get and set values based on the `attr` argument for this proxy. If you would like to customize this behavior, you may supply a `getset_factory` callable that produces a tuple of `getter` and `setter` functions. The factory is called with two arguments, the abstract type of the underlying collection and this proxy instance. :param proxy_factory: Optional. The type of collection to emulate is determined by sniffing the target collection. If your collection type can't be determined by duck typing or you'd like to use a different collection implementation, you may supply a factory function to produce those collections. Only applicable to non-scalar relationships. :param proxy_bulk_set: Optional, use with proxy_factory. See the _set() method for details. :param info: optional, will be assigned to :attr:`.AssociationProxy.info` if present. .. versionadded:: 1.0.9 z _%s_%s_%sN) r value_attrcreatorgetset_factory proxy_factoryproxy_bulk_setcascade_scalar_deletestype__name__idkeyinfo) selfr r rrrrrrrrr__init__csI zAssociationProxy.__init__cCs*|dur|S|||}|r||S|SN) _as_instanceget)robjclass_instrrr__get__s   zAssociationProxy.__get__cCst|}|||||Sr )rr!set)rr#valuesr$rrr__set__szAssociationProxy.__set__cCst|}||||Sr )rr!delete)rr#r$rrr __delete__szAssociationProxy.__delete__cC |||S)aReturn the internal state local to a specific mapped class. E.g., given a class ``User``:: class User(Base): # ... keywords = association_proxy('kws', 'keyword') If we access this :class:`.AssociationProxy` from :attr:`.Mapper.all_orm_descriptors`, and we want to view the target class for this proxy as mapped by ``User``:: inspect(User).all_orm_descriptors["keywords"].for_class(User).target_class This returns an instance of :class:`.AssociationProxyInstance` that is specific to the ``User`` class. The :class:`.AssociationProxy` object remains agnostic of its parent class. :param class\_: the class that we are returning state for. :param obj: optional, an instance of the class that is required if the attribute refers to a polymorphic target, e.g. where we have to look at the type of the actual destination object to get the complete path. .. versionadded:: 1.3 - :class:`.AssociationProxy` no longer stores any state specific to a particular parent class; the state is now stored in per-class :class:`.AssociationProxyInstance` objects. )r!)rr$r#rrr for_classs !zAssociationProxy.for_classcCs|z |j|jd}Wn%ty/||}|dur+t|||}t||jd|nd}Ynw|dur<|js<||S|S)N_inst) __dict__rKeyError _calc_ownerAssociationProxyInstance for_proxysetattr _is_canonical_non_canonical_get_for_object)rr$r#r%ownerrrrr!s   zAssociationProxy._as_instancecCs.zt|}Wn tjyYdSw|jjjSr )rrNoInspectionAvailablemapper class_managerr$)r target_clsinsprrrr1s   zAssociationProxy._calc_ownercL|jtfdd}|turfdd}||fSfdd}||fS)Nc|dur|SdSr rtarget_getterrrgetterz0AssociationProxy._default_getset..gettercst||dSr r4okvr rrsetter z0AssociationProxy._default_getset..settercst||dSr rErGrIrJrrrK%rLroperator attrgetterdictrcollection_classrCrKrrBr r_default_getset    z AssociationProxy._default_getsetcCsd|j|jfS)NzAssociationProxy(%r, %r))r rrrrr__repr__*szAssociationProxy.__repr__)NNNNNFr )r __module__ __qualname____doc__ is_attributerextension_typerr&r)r+r-r!r1rUrXrrrrr ]s& Y  # r c@s"eZdZdZddZdZ eddZeddZd d Z e d d Z ed dZ e jddZe ddZe ddZe ddZe jddZe jddZe ddZddZdd Ze d!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd7d/d0Zd7d1d2Z d7d3d4Z!d5d6Z"dS)8r2aA per-class object that serves class- and object-specific results. This is used by :class:`.AssociationProxy` when it is invoked in terms of a specific class or instance of a class, i.e. when it is used as a regular Python descriptor. When referring to the :class:`.AssociationProxy` as a normal Python descriptor, the :class:`.AssociationProxyInstance` is the object that actually serves the information. Under normal circumstances, its presence is transparent:: >>> User.keywords.scalar False In the special case that the :class:`.AssociationProxy` object is being accessed directly, in order to get an explicit handle to the :class:`.AssociationProxyInstance`, use the :meth:`.AssociationProxy.for_class` method:: proxy_state = inspect(User).all_orm_descriptors["keywords"].for_class(User) # view if proxy object is scalar or not >>> proxy_state.scalar False .. versionadded:: 1.3 cCs2||_|j|_||_|j|_d|_||_||_dSr )parentr owning_classr rS target_classr)rr^r_r`rrrrrOs z!AssociationProxyInstance.__init__Nc Cs||j}|j}t||}t|tjstd|jj }z| ||}Wnt y4t ||||YSw| |||||S)NzEassociation proxy to a non-relationship intermediary is not supported)r rr class_mapper get_property isinstanceRelationshipPropertyNotImplementedErrorr9r$_cls_unwrap_target_assoc_proxyAttributeError!AmbiguousAssociationProxyInstance_construct_for_assoc) clsr^r_parent_instancer rpropr` target_assocrrrr3as(   z"AssociationProxyInstance.for_proxycCs^|dur t||||St||}t|dst||||S|j}|r(t||||St||||S)N_is_internal_proxy)ObjectAssociationProxyInstancegetattrhasattrrh_impl_uses_objectsColumnAssociationProxyInstance)rjrmr^r_r`rr is_objectrrrris"  z-AssociationProxyInstance._construct_for_assoccCst|j|jSr )rrar_rbr rWrrr _get_propertys z&AssociationProxyInstance._get_propertycCs |jSr )ru comparatorrWrrr _comparator z$AssociationProxyInstance._comparatorcCs t||}t|ttfr|SdSr )rprcr r2)rjr`rr rrrrfs z7AssociationProxyInstance._cls_unwrap_target_assoc_proxycCs||j|jSr )rfr`rrWrrr_unwrap_target_assoc_proxysz3AssociationProxyInstance._unwrap_target_assoc_proxycCt|j|jS)zThe 'remote' class attribute referenced by this :class:`.AssociationProxyInstance`. .. seealso:: :attr:`.AssociationProxyInstance.attr` :attr:`.AssociationProxyInstance.local_attr` )rpr`rrWrrr remote_attr z$AssociationProxyInstance.remote_attrcCrz)zThe 'local' class attribute referenced by this :class:`.AssociationProxyInstance`. .. seealso:: :attr:`.AssociationProxyInstance.attr` :attr:`.AssociationProxyInstance.remote_attr` )rpr_r rWrrr local_attrr|z#AssociationProxyInstance.local_attrcCs |j|jfS)azReturn a tuple of ``(local_attr, remote_attr)``. This attribute is convenient when specifying a join using :meth:`.Query.join` across two relationships:: sess.query(Parent).join(*Parent.proxied.attr) .. seealso:: :attr:`.AssociationProxyInstance.local_attr` :attr:`.AssociationProxyInstance.remote_attr` )r}r{rWrrrr s zAssociationProxyInstance.attrcCs|j }|r ||S)zsReturn ``True`` if this :class:`.AssociationProxyInstance` proxies a scalar relationship on the local side.)ruuselist_initialize_scalar_accessors)rscalarrrrrs zAssociationProxyInstance.scalarcCs|j|jj Sr )rur9rbrr~rWrrr_value_is_scalars  z)AssociationProxyInstance._value_is_scalarcCstr rerWrrr_target_is_objectsz*AssociationProxyInstance._target_is_objectcCs>|jjr|jd|\}}n|jd\}}|||_|_dSr )r^rrU _scalar_get _scalar_set)rr"set_rrrrsz5AssociationProxyInstance._initialize_scalar_accessorscr=)Ncr>r rr?rArrrCrDz8AssociationProxyInstance._default_getset..gettercs t||Sr rErFrJrrrK z8AssociationProxyInstance._default_getset..settercs t||Sr rErMrJrrrKrrNrRrrTrrUrVz(AssociationProxyInstance._default_getsetcCs|jjSr )r^rrWrrrr szAssociationProxyInstance.infocCs|dur|S|jrt||j}||Sz t||j\}}}Wn ty(Ynwt||kr>t||kr>|jdusz_AssociationCollection.cC t|jSr lencolrWrrr__len__ z_AssociationCollection.__len__cCrr )boolrrWrrr__bool__rz_AssociationCollection.__bool__cCr)Nr^rrrWrrrrrz#_AssociationCollection.__getstate__cCs$|d|_|d|_|j|dS)Nr^r)r^rrrrrrrs  z#_AssociationCollection.__setstate__cCs||||dSr )clearr)r assoc_proxyr(rrrrsz$_AssociationCollection._bulk_replaceN) rrYrZrrrrr __nonzero__rrrrrrrrs  rc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZdLd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!e!Z"d?d@Z#dAdBZ$dCdDZ%dEdFZ&dGdHZ'dIdJZ(e)e*+D]\Z,Z-e./e-re-je,kre-jse0e)e,re1e)e,je-_q[,[-dKS)Mrz(Generic, converting, list-to-list proxy.cC ||Sr rrvaluerrr_createrz_AssociationList._createcCrr rCrobject_rrr_getrz_AssociationList._getcCr,r rK)rrrrrrrrz_AssociationList._setcs2t|ts j|Sfddj|DS)Ncg|]}|qSrr.0memberrWrr z0_AssociationList.__getitem__..)rcslicerrrindexrrWr __getitem__s z_AssociationList.__getitem__c Cst|ts||j||dS|jdurt|}n|jdkr't||j}n|j}|jp.d}|jp3d}tt |jp:d||}|dkr^|D]}||=qE|}|D] }| |||d7}qOdSt|t|krrt dt|t|ft ||D] \}}||j||qwdS)NrzBattempt to assign sequence of size %s to extended slice of size %s) rcrrrstoprstepstartrrangeinsert ValueErrorzip) rrrrrrrngiitemrrr __setitem__s6        z_AssociationList.__setitem__cC |j|=dSr rrrrr __delitem__ rz_AssociationList.__delitem__cC$|jD] }|||krdSqdSNTFrrrrrrrr __contains__  z_AssociationList.__contains__csfddj||DS)NcrrrrrWrrrrz1_AssociationList.__getslice__..rrrendrrWr __getslice__sz_AssociationList.__getslice__cs$fdd|D}|j||<dS)Ncrr)r)rrIrWrrrrz1_AssociationList.__setslice__..r)rrrr(membersrrWr __setslice__sz_AssociationList.__setslice__cCs|j||=dSr rrrrr __delslice__rLz_AssociationList.__delslice__cc|jD]}||VqdS)zIterate over proxied values. For the actual domain objects, iterate over .col instead or just use the underlying collection directly from its property on the parent. Nrrrrrr__iter__s z_AssociationList.__iter__cCs|j}||}||dSr )rrappend)rrrrrrrr )s z_AssociationList.appendcs&tddtfddt|DS)NcSsg|]}dqS)rr)r_rrrr0sz*_AssociationList.count..cs|kSr r)rIrrrr3rz(_AssociationList.count..)sumritertools_filteriterrrrrcount.sz_AssociationList.countcC|D]}||qdSr )r )rr(rIrrrr8 z_AssociationList.extendcCs||g|j||<dSr )rr)rrrrrrr<sz_AssociationList.insertcCs||j|Sr )rCrrrrrrr?rz_AssociationList.popcCs0t|D]\}}||kr|j|=dSqtd)Nzvalue not in list) enumeraterr)rrrvalrrrremoveBs z_AssociationList.removecCt)z#Not supported, use reversed(mylist)rrWrrrreverseIz_AssociationList.reversecCr)z!Not supported, use sorted(mylist)rrWrrrsortNrz_AssociationList.sortcCs|jdt|j=dS)Nr)rrrWrrrrSz_AssociationList.clearcC t||kSr rrrrrrrVrz_AssociationList.__eq__cC t||kSr r r!rrrrYrz_AssociationList.__ne__cC t||kSr r r!rrr__lt__\rz_AssociationList.__lt__cC t||kSr r r!rrr__le___rz_AssociationList.__le__cC t||kSr r r!rrr__gt__brz_AssociationList.__gt__cC t||kSr r r!rrr__ge__erz_AssociationList.__ge__cCtt||Sr )rcmprr!rrr__cmp__hrLz_AssociationList.__cmp__cCs0zt|}Wn tytYSwt||Sr r TypeErrorNotImplementedriterablerrrr__add__k    z_AssociationList.__add__cCs0zt|}Wn tytYSw|t|Sr r.r1rrr__radd__rr4z_AssociationList.__radd__cCst|tstSt||Sr )rcintr0rrnrrr__mul__ys  z_AssociationList.__mul__cCs|||Sr )r)rr2rrr__iadd__s z_AssociationList.__iadd__cCsDt|tstS|dkr||S|dkr |t||d|SNrr)rcr6r0rrrr7rrr__imul__s z_AssociationList.__imul__cGst|j|g|RSr )rr)rrargsrrrrrz_AssociationList.indexcCt|Sr r rWrrrcopyz_AssociationList.copycC tt|Sr )reprrrWrrrrXrz_AssociationList.__repr__cCtdt|jNz%s objects are unhashabler/rrrWrrr__hash__rz_AssociationList.__hash__N)r)2rrYrZr[rrrrrrrrrr r r rrrrrrrrrrr$r&r(r*r-r3r5r9__rmul__r:r<rr?rXrFrlocalsitems func_namefuncrcallablerqrprrrrrsd     r _NotProvidedc@s~eZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%ZdEd'd(ZdEd)d*Zd+d,Zejrtd-d.Zd/d0Zd1d2Zd3d4Zd5d6Znd7d6Zd8d4Ze fd9d:Z!d;d<Z"d=d>Z#d?d@Z$dAdBZ%dCdDZ&e'e(D]\Z)Z*e+e*re*je)kre*jse,e-e)re.e-e)je*_q[)[*d&S)Frz(Generic, converting, dict-to-dict proxy.cCr,r rrrrrrrrrz_AssociationDict._createcCrr rrrrrrrz_AssociationDict._getcCs||||Sr r)rrrrrrrrrz_AssociationDict._setcCs||j|Sr rrrrrrrrrLz_AssociationDict.__getitem__cCs8||jvr||j|||dS||||j|<dSr )rrrrNrrrrs z_AssociationDict.__setitem__cCrr rrPrrrrrz_AssociationDict.__delitem__cC ||jvSr rrPrrrrrxz_AssociationDict.__contains__cCrQr rrPrrrhas_keyrxz_AssociationDict.has_keycCst|jSr )rrkeysrWrrrr rz_AssociationDict.__iter__cC|jdSr rrrWrrrrrz_AssociationDict.clearcCrr rQr!rrrrrz_AssociationDict.__eq__cCr"r rVr!rrrrrz_AssociationDict.__ne__cCr#r rVr!rrrr$rz_AssociationDict.__lt__cCr%r rVr!rrrr&rz_AssociationDict.__le__cCr'r rVr!rrrr(rz_AssociationDict.__gt__cCr)r rVr!rrrr*rz_AssociationDict.__ge__cCr+r )rr,rQr!rrrr-rLz_AssociationDict.__cmp__cCstt|Sr )rBrQrIrWrrrrXrLz_AssociationDict.__repr__NcCs"z||WSty|YSwr )r0rrdefaultrrrr"s   z_AssociationDict.getcCs(||jvr||||j|<|S||Sr )rrrWrrr setdefaults z_AssociationDict.setdefaultcC |jSr )rrSrWrrrrSrz_AssociationDict.keyscfddjDS)Nc3$|] }|j|fVqdSr rOrrrWrr "z-_AssociationDict.iteritems..rrWrrWr iteritemsrDz_AssociationDict.iteritemscr[)Nc3 |] }j|VqdSr rOr]rWrrr^z._AssociationDict.itervalues..rrWrrWr itervaluesrDz_AssociationDict.itervaluescCrZr )riterkeysrWrrrrdrz_AssociationDict.iterkeyscsfddjDS)NcrrrrrWrrrrz+_AssociationDict.values..)rr(rWrrWrr(sz_AssociationDict.valuescsfddDS)Ncs g|] }|j|fqSrrO)rrHrWrrrs z*_AssociationDict.items..rrWrrWrrIrz_AssociationDict.itemscr[)Nc3r\r rOr]rWrrr^ r_z)_AssociationDict.items..rrWrrWrrI rDcr[)Nc3rar rOr]rWrrr^rbz*_AssociationDict.values..rrWrrWrr(rDcCs.|tur |j|}n|j||}||Sr )rMrrr)rrrXrrrrrs z_AssociationDict.popcCs |j}|d||dfSr;)rpopitemr)rrrrrres z_AssociationDict.popitemc Ost|dkrtdt|t|dkrB|d}t|dr)|D]}||||<qnz |D]\}}|||<q,Wn tyAtdw|D]\}}|||<qDdS)Nrz+update expected at most 1 arguments, got %irrSz4dictionary update sequence requires 2-element tuples)rr/rqr) rar seq_or_maprrHrIrrrrrrs,         z_AssociationDict.updatec Cs~t|}||p d}t|pd|}||}|pdD]\}}||vr,|||<q||vr4|||<q|D]}||=q7dSr)r' intersection differencerI) rrr(existing constants additionsremovalsrrrrrr7s  z_AssociationDict._bulk_replacecCs t|Sr )rQrIrWrrrr?Frz_AssociationDict.copycCrCrDrErWrrrrFIrz_AssociationDict.__hash__r )/rrYrZr[rrrrrrrrRr rrrr$r&r(r*r-rXr"rYrSrpy2kr`rcrdr(rIrMrrerrr?rFrrHrJrKrLrqrQrprrrrrs`     rc@seZdZdZddZddZddZdd ZeZd d Z d d Z ddZ ddZ ddZ ddZddZddZddZddZddZeZd d!ZeZd"d#Zd$d%Zd&d'ZeZd(d)Zd*d+Zd,d-ZeZd.d/Zd0d1Z d2d3Z!d4d5Z"d6d7Z#d8d9Z$d:d;Z%dd?Z'd@dAZ(dBdCZ)dDdEZ*dFdGZ+dHdIZ,e-e./D]\Z0Z1e23e1re1je0kre1jse4e5e0re6e5e0je1_q[0[1dJS)Krz&Generic, converting, set-to-set proxy.cCrr rrrrrrZrz_AssociationSet._createcCrr rrrrrr]rz_AssociationSet._getcCrr rrWrrrr`rz_AssociationSet.__len__cCs|jrdSdSrrrWrrrrcsz_AssociationSet.__bool__cCrrrrrrrrkrz_AssociationSet.__contains__ccr )zIterate over proxied values. For the actual domain objects, iterate over .col instead or just use the underlying collection directly from its property on the parent. Nrr rrrr rs z_AssociationSet.__iter__cCs"||vr|j||dSdSr )raddrrrrrro}sz_AssociationSet.addcCs0|jD]}|||kr|j|dSqdSr )rrdiscardrrrrrps  z_AssociationSet.discardcCs4|jD]}|||kr|j|dSqt|r )rrrpr0rrrrrs  z_AssociationSet.removecCs"|jstd|j}||S)Nzpop from an empty set)rr0rrr rrrrs  z_AssociationSet.popcCrr )rorrrrrrrrz_AssociationSet.updatec Cst|}||p d}t|pd|}||}|j}|j}|p"dD]} | |vr.|| q#| |vr6|| q#|D]} || q9dSr)r'rhriror) rrr(rjrkrlrmappenderremoverrrrrrs    z_AssociationSet._bulk_replacecC(t||stS|D]}||q |Sr )r_set_binops_check_strictr0rorqrrr__ior__  z_AssociationSet.__ior__cCrAr )r'rrWrrrrrz_AssociationSet._setcCt||Sr )r'unionr!rrrryrz_AssociationSet.unioncCrxr )r'rir!rrrrirz_AssociationSet.differencecCrr )rprqrrrdifference_updaterz!_AssociationSet.difference_updatecCrtr )rrur0rprqrrr__isub__rwz_AssociationSet.__isub__cCrxr )r'rhr!rrrrhrz_AssociationSet.intersectioncCR||t|}}||||}}|D]}||q|D]}||qdSr )rhr'rrorrwanthaverrorrrrintersection_update  z#_AssociationSet.intersection_updatecCbt||stS||t|}}||||}}|D]}||q|D]}||q'|Sr )rrur0rhr'rror}rrr__iand__   z_AssociationSet.__iand__cCrxr )r'symmetric_differencer!rrrrrz$_AssociationSet.symmetric_differencecCr|r )rr'rror}rrrsymmetric_difference_updaterz+_AssociationSet.symmetric_difference_updatecCrr )rrur0rr'rror}rrr__ixor__rz_AssociationSet.__ixor__cCrxr )r'issubsetr!rrrrrz_AssociationSet.issubsetcCrxr )r' issupersetr!rrrrrz_AssociationSet.issupersetcCrTr rUrWrrrr rz_AssociationSet.clearcCr>r r'rWrrrr? r@z_AssociationSet.copycCrr rr!rrrrrz_AssociationSet.__eq__cCr"r rr!rrrrrz_AssociationSet.__ne__cCr#r rr!rrrr$rz_AssociationSet.__lt__cCr%r rr!rrrr&rz_AssociationSet.__le__cCr'r rr!rrrr(rz_AssociationSet.__gt__cCr)r rr!rrrr*rz_AssociationSet.__ge__cCrAr )rBr'rWrrrrX!rz_AssociationSet.__repr__cCrCrDrErWrrrrF$rz_AssociationSet.__hash__N)7rrYrZr[rrrrrrr rorprrrrrvrry__or__ri__sub__rzr{rh__and__rrr__xor__rrrrrr?rrr$r&r(r*rXrFrrHrIrJrKrrLrqr'rprrrrrWsl      r)r[rOrrrrrrsqlr sql.operatorsr rsymbolrInspectionAttrInfor objectr2rhrorsrrrrMrrrrrrs@         7 U3\ ;7 P-