ó
î%![c        	   @   s”  d  Z  d d l Z d d l Z d d l Z d d l m Z d d l m Z d d l m Z e j	 d ƒ Z
 e j j j Z e j	 d ƒ Z e j ƒ  Z e j d( k r± d
 Z d Z n d Z d Z e d d h Z d d d d d d d d d h	 Z d „  Z d e f d „  ƒ  YZ d d „ Z d „  Z d e f d „  ƒ  YZ d  e f d! „  ƒ  YZ d" e f d# „  ƒ  YZ d$ e f d% „  ƒ  YZ d& e f d' „  ƒ  YZ  d S()   sX   This module contains base classes and functions for the nodes and some
inference utils.
iÿÿÿÿN(   t   context(   t
   exceptions(   t   utils   interpreter.objectmodelt   manageri   i    t   builtinst   __bool__t   __builtin__t   __nonzero__s	   .propertys   abc.abstractpropertyt   cached_propertyt   cachedpropertyt   lazypropertyt   lazy_propertyt   reifyt   lazyattributet   lazy_attributet   LazyPropertyt   lazyc            sI   t  j |  j ƒ  ƒ r t Sd „  |  j ƒ  Dƒ ‰  t ‡  f d †  t Dƒ ƒ S(   Nc         S   s2   h  |  ]( } | t  j k	 r | j d  ƒ d ’ q S(   t   .iÿÿÿÿ(   R   t   Uninferablet   split(   t   .0t   name(    (    s,   lib/python2.7/site-packages/astroid/bases.pys	   <setcomp>4   s   	 c         3   s   |  ] } | ˆ  k Vq d  S(   N(    (   R   R   (   t   stripped(    s,   lib/python2.7/site-packages/astroid/bases.pys	   <genexpr>6   s    (   t
   PROPERTIESt   intersectiont   decoratornamest   Truet   anyt   POSSIBLE_PROPERTIES(   t   meth(    (   R   s,   lib/python2.7/site-packages/astroid/bases.pyt   _is_property1   s    t   Proxyc           B   s5   e  Z d  Z d Z d d „ Z d „  Z d d „ Z RS(   s   a simple proxy objectc         C   s   | d  k	 r | |  _ n  d  S(   N(   t   Nonet   _proxied(   t   selft   proxied(    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   __init__>   s    c         C   sF   | d k r t  |  j d ƒ S| |  j k r6 |  j | St  |  j | ƒ S(   NR!   (   t   getattrt	   __class__t   __dict__R!   (   R"   R   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   __getattr__B   s
    c         c   s	   |  Vd  S(   N(    (   R"   R    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   inferI   s    N(   t   __name__t
   __module__t   __doc__R    R!   R$   R(   R)   (    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR   9   s
   	c         c   s  d } t } | d k	 r0 | j } | j ƒ  } n d } t j ƒ  } xª |  D]¢ } | t j k ro | Vt } qI n  | j	 | | ƒ | _ y, x% | j
 d | ƒ D] } | Vt } qš WWqI t j k
 rÉ qI qI t j k
 rê t j Vt } qI XqI W| st j d d |  d | d | ƒ‚ n  d S(   sG   Return an iterator on statements inferred by each statement in *stmts*.R    s.   Inference failed for all members of {stmts!r}.t   stmtst   frameN(   R    t   Falset
   lookupnamet   clonet
   contextmodt   InferenceContextR   R   R   t   _infer_nameR)   R   t   NameInferenceErrort   InferenceError(   R-   R    R.   t   stmtt   inferredR   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   _infer_stmtsM   s4    	c         C   s¢   t  |  j | d | ƒd  ƒ } | r› t | d ƒ r› | j ƒ  sF t j SxR | j |  d | ƒD]8 } | t j k ru | St  | j d | ƒ ƒ } | j	 ƒ  SWn  t j S(   NR    t   infer_call_result(
   t   nextt   igetattrR    t   hasattrt   callableR   R   R:   R)   t
   bool_value(   t   instancet   method_nameR    R   t   valueR8   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   _infer_method_result_truthm   s    t   BaseInstancec           B   sP   e  Z d  Z d Z d „  Z d e d „ Z d d „ Z d d „ Z	 d d „ Z
 RS(   sN   An instance base class, which provides lookup methods for potential instances.c         C   s   d S(   Ns   Instance of(    (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   display_type‚   s    c         C   sä   y |  j  j | | ƒ } Wnƒ t j k
 rž |  j rW | |  j k rW |  j j | ƒ g S| rv |  j  j | | d t ƒSt j	 t j d |  d | d | ƒ ƒ n X| rà y! | |  j  j | | d t ƒSWqà t j k
 rÜ qà Xn  | S(   Nt   class_contextt   targett	   attributeR    (
   R!   t   instance_attrR   t   AttributeInferenceErrort   special_attributest   lookupR%   R/   R   t   reraise(   R"   R   R    t   lookupclasst   values(    (    s,   lib/python2.7/site-packages/astroid/bases.pyR%   …   s$    c         c   sE  | s t  j ƒ  } n  yi | j |  j | f ƒ r4 d S|  j | | d t ƒ} x. t |  j | | ƒ | d |  ƒD] } | Vqn WWnÀ t j	 k
 r@} yu |  j j
 j d k rÊ t j t j t | ƒ   ƒ n  |  j j | | d t ƒ} x |  j | | ƒ D] } | Vqø WWqAt j	 k
 r<} t j t j t | ƒ   ƒ qAXn Xd S(   s   inferred getattrNRN   R.   t   ClassDefRF   (   R2   R3   t   pushR!   R%   R/   R9   t
   _wrap_attrR   RJ   R&   R*   R   RM   R6   t   varsR<   (   R"   R   R    t   get_attrR7   t   errort   attrs(    (    s,   lib/python2.7/site-packages/astroid/bases.pyR<   Ÿ   s$    c         c   sè   xá | D]Ù } t  | t ƒ r^ t | ƒ rM x0 | j |  | ƒ D] } | Vq; Wqà t | |  ƒ Vq t | d ƒ rÛ | j d k rÛ | j ƒ  j ƒ  |  j	 k rÓ | j
 j
 rÓ | j
 j
 d j d k rÓ t | |  ƒ Vq qÓ n  | Vq | Vq Wd S(   s7   wrap bound methods of attrs in a InstanceMethod proxiesR   s   <lambda>i    R"   N(   t
   isinstancet   UnboundMethodR   R:   t   BoundMethodR=   R   t	   statementt   scopeR!   t   args(   R"   RV   R    t   attrR8   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRR   º   s    %	c         c   s›   t  } xg |  j j d | ƒ D]P } | t j k s | j ƒ  rD q n  x% | j | | ƒ D] } t } | VqW Wq W| s— t j	 d |  d | d | ƒ ‚ n  d S(   s4   infer what a class instance is returning when calledt   __call__t   nodet   callerR    N(
   R/   R!   R<   R   R   R>   R:   R   R   R6   (   R"   R`   R    R8   R_   t   res(    (    s,   lib/python2.7/site-packages/astroid/bases.pyR:   Ñ   s    N(   R*   R+   R,   R    RK   RE   R   R%   R<   RR   R:   (    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRD   }   s   	t   Instancec           B   sb   e  Z d  Z e j d „  ƒ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 d „ Z RS(
   s-   A special node representing a class instance.c           C   s
   t  j ƒ  S(   N(   t   objectmodelt   InstanceModel(    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   <lambda>ã   s    c         C   s)   d |  j  j ƒ  j |  j  j t |  ƒ f S(   Ns   <Instance of %s.%s at 0x%s>(   R!   t   rootR   t   id(   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   __repr__å   s    	c         C   s    d |  j  j ƒ  j |  j  j f S(   Ns   Instance of %s.%s(   R!   Rf   R   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   __str__é   s    c         C   s:   y |  j  j d d t ƒt SWn t j k
 r5 t SXd  S(   NR^   RF   (   R!   R%   R/   R   R   RJ   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR>   í   s
    c         C   s   |  j  j ƒ  S(   N(   R!   t   qname(   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   pytypeô   s    c         C   s   d S(   Ns   Instance of(    (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRE   ÷   s    c         C   s›   t  j ƒ  } t  j d g  ƒ | _ |  | _ y t |  t | ƒ } WnT t j t j	 f k
 r– y t |  d | ƒ } Wq— t j	 t j f k
 r’ t
 SXn X| S(   sV  Infer the truth value for an Instance

        The truth value of an instance is determined by these conditions:

           * if it implements __bool__ on Python 3 or __nonzero__
             on Python 2, then its bool value will be determined by
             calling this special method and checking its result.
           * when this method is not defined, __len__() is called, if it
             is defined, and the object is considered true if its result is
             nonzero. If a class defines neither __len__() nor __bool__(),
             all its instances are considered true.
        R\   t   __len__(   R2   R3   t   CallContextt   callcontextt	   boundnodeRC   t   BOOL_SPECIAL_METHODR   R6   RJ   R   (   R"   R    t   result(    (    s,   lib/python2.7/site-packages/astroid/bases.pyR?   ú   s    		c         C   s   d  S(   N(    (   R"   t   indexR    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   getitem  s    N(   R*   R+   R,   R   t   lazy_descriptorRK   Rh   Ri   R>   Rk   RE   R?   R    Rs   (    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRb   ß   s   						RX   c           B   s\   e  Z d  Z e j d „  ƒ Z d „  Z d „  Z d d „ Z	 d d „ Z
 d „  Z d „  Z RS(	   s=   a special node representing a method not bound to an instancec           C   s
   t  j ƒ  S(   N(   Rc   t   UnboundMethodModel(    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRe     s    c         C   s>   |  j  j j ƒ  } d |  j j |  j  j | j ƒ  t |  ƒ f S(   Ns   <%s %s of %s at 0x%s(   R!   t   parentR.   R&   R*   R   Rj   Rg   (   R"   R.   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRh   !  s    	c         C   s   t  S(   N(   R/   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   is_bound'  s    c         C   s5   | |  j  k r" |  j  j | ƒ g S|  j j | | ƒ S(   N(   RK   RL   R!   R%   (   R"   R   R    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR%   *  s    c         C   s;   | |  j  k r( t |  j  j | ƒ f ƒ S|  j j | | ƒ S(   N(   RK   t   iterRL   R!   R<   (   R"   R   R    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR<   /  s    c         C   sw   |  j  j d k rd |  j  j j ƒ  j ƒ  d t k rd | j rP | j d j ƒ  n g  } d „  | Dƒ S|  j  j | | ƒ S(   Nt   __new__s	   %s.objecti    c         s   s0   |  ]& } | t  j k	 r$ t | ƒ n | Vq d  S(   N(   R   R   Rb   (   R   t   x(    (    s,   lib/python2.7/site-packages/astroid/bases.pys	   <genexpr>:  s    (	   R!   R   Rv   R.   Rj   t   BUILTINSR\   R)   R:   (   R"   R`   R    R)   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR:   4  s
    ""c         C   s   t  S(   N(   R   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR?   =  s    N(   R*   R+   R,   R   Rt   RK   Rh   Rw   R    R%   R<   R:   R?   (    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRX     s   				RY   c           B   sP   e  Z d  Z e j d „  ƒ Z d „  Z d „  Z d „  Z d d „ Z
 d „  Z RS(   s9   a special node representing a method bound to an instancec           C   s
   t  j ƒ  S(   N(   Rc   t   BoundMethodModel(    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRe   E  s    c         C   s   t  j |  | ƒ | |  _ d  S(   N(   RX   R$   t   bound(   R"   t   proxyR}   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR$   G  s    c         C   s   t  S(   N(   R   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRw   K  s    c         C   sl  d d l  m } t | j d j d | ƒ ƒ } | j j d k rE d S| j d t	 ƒ s\ d St | j d j d | ƒ ƒ } | j j d k r‘ d St
 | j t ƒ s§ d St | j d	 j d | ƒ ƒ } | j j d
 k rÜ d Sg  | j D] } t | j d | ƒ ƒ ^ qæ } t d „  | Dƒ ƒ r$d St | j d j d | ƒ ƒ }	 |	 j j d k rYd St j t ƒ }
 x‡ |	 j D]| \ } } t | j d | ƒ ƒ } t | j d | ƒ ƒ } | j j d k rÄd St
 | j t ƒ sÚd S|
 | j j | ƒ qrW| j d | j d | j d | j d | ƒ } | j ƒ  } | j d | j d | g d g  d t d | d g  ƒ |
 | _ | S(   s=  Try to infer what type.__new__(mcs, name, bases, attrs) returns.

        In order for such call to be valid, the metaclass needs to be
        a subtype of ``type``, the name needs to be a string, the bases
        needs to be a tuple of classes and the attributes a dictionary
        of strings to values.
        iÿÿÿÿ(   t   node_classesi    R    RP   s   %s.typei   t   Consti   t   Tuplec         s   s!   |  ] } | j  j d  k Vq d S(   RP   N(   R&   R*   (   R   t   base(    (    s,   lib/python2.7/site-packages/astroid/bases.pys	   <genexpr>p  s   i   t   DictR   t   linenot
   col_offsetRv   t   basest   bodyt
   decoratorst   newstylet	   metaclasst   keywordsN(   t   astroidR   R;   R\   R)   R&   R*   R    t   is_subtype_ofR{   RW   RB   t   strt   eltsR   t   collectionst   defaultdictt   listt   itemst   appendR„   R…   t   Passt   postinitR   t   locals(   R"   R`   R    R   t   mcsR   R†   t   eltt   inferred_basesRV   t
   cls_localst   keyRB   t   clst   empty(    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   _infer_type_new_callN  sN    +			!	c         C   sá   | d  k r t j ƒ  } n  | j ƒ  } |  j | _ |  j j j d k rÈ |  j j d k rÈ |  j d k rÈ t	 | j
 ƒ d k rÈ |  j j j ƒ  j ƒ  d t k rÈ |  j | | ƒ } | rÈ t | f ƒ Sn  t t |  ƒ j | | ƒ S(   NRP   t   typeRy   i   s	   %s.object(   R    R2   R3   R1   R}   Ro   R&   R*   R   t   lenR\   R!   Rv   R.   Rj   R{   RŸ   Rx   t   superRY   R:   (   R"   R`   R    t   new_cls(    (    s,   lib/python2.7/site-packages/astroid/bases.pyR:     s    "c         C   s   t  S(   N(   R   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR?   ¤  s    N(   R*   R+   R,   R   Rt   RK   R$   Rw   RŸ   R    R:   R?   (    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRY   A  s   			Bt	   Generatorc           B   sb   e  Z d  Z e j d „  ƒ Z d	 d „ Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z RS(
   se   a special node representing a generator.

    Proxied class is set once for all in raw_building.
    c           C   s
   t  j ƒ  S(   N(   Rc   t   GeneratorModel(    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRe   ¯  s    c         C   s   | |  _  d  S(   N(   Rv   (   R"   Rv   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR$   ²  s    c         C   s   t  S(   N(   R/   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR>   µ  s    c         C   s   d t  S(   Ns   %s.generator(   R{   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRk   ¸  s    c         C   s   d S(   NR¤   (    (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRE   »  s    c         C   s   t  S(   N(   R   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR?   ¾  s    c         C   s    d |  j  j |  j t |  ƒ f S(   Ns   <Generator(%s) l.%s at 0x%s>(   R!   R   R„   Rg   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRh   Á  s    c         C   s   d |  j  j S(   Ns   Generator(%s)(   R!   R   (   R"   (    (    s,   lib/python2.7/site-packages/astroid/bases.pyRi   Ä  s    N(   R*   R+   R,   R   Rt   RK   R    R$   R>   Rk   RE   R?   Rh   Ri   (    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyR¤   ¨  s   					(   i   i    (!   R,   R   t   syst   sixRŒ   R    R2   R   R   t   lazy_importRc   t   movesR   R*   R{   R   t   AstroidManagert   MANAGERt   version_infoRp   R   R   R   t   objectR   R    R9   RC   RD   Rb   RX   RY   R¤   (    (    (    s,   lib/python2.7/site-packages/astroid/bases.pyt   <module>   s:   	
		 	b<&g