B
    S\JZ                 @   s  d Z ddlZddlZddlZddlZddlmZ ddlZddlmZ	 ddlm
Z
 ddlmZ dZdd	 ZG d
d dZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZG d"d# d#eZG d$d% d%eZeeeeeeeeeeeeeeeeeed&ZG d'd( d(eZdS ))a  
Data object model, as per https://docs.python.org/3/reference/datamodel.html.

This module describes, at least partially, a data object model for some
of astroid's nodes. The model contains special attributes that nodes such
as functions, classes, modules etc have, such as __doc__, __class__,
__module__ etc, being used when doing attribute lookups over nodes.

For instance, inferring `obj.__class__` will first trigger an inference
of the `obj` variable. If it was successfully inferred, then an attribute
`__class__ will be looked for in the inferred object. This is the part
where the data model occurs. The model is attached to those nodes
and the lookup mechanism will try to see if attributes such as
`__class__` are defined by the model or not. If they are defined,
the model will be requested to return the corresponding value of that
attribute. Thus the model can be viewed as a special part of the lookup
mechanism.
    N)	lru_cache)context)
exceptions)node_classesZattr_c                sP   t j| d  fddt| D }dd | D } tt||  S )N)parentc                s   g | ]}t j| d qS ))valuer   )r   Const).0r   )obj >lib/python3.7/site-packages/astroid/interpreter/objectmodel.py
<listcomp>0   s    z _dunder_dict.<locals>.<listcomp>c             S   s   g | ]}|d  qS )r   )r	   elemr   r   r   r   6   s    )r   Dictlistkeysvaluespostinitzip)instance
attributesr   r   r   )r
   r   _dunder_dict+   s
    r   c               @   sP   e Zd Zdd Zdd Zdd Zddd	Zd
d Zedddd Z	dd Z
dS )ObjectModelc             C   s
   d | _ d S )N)	_instance)selfr   r   r   __init__=   s    zObjectModel.__init__c       
      C   s   g }t | j}d}t|d }xvt|  D ]f}dt| | }tj|d|dd}|d g}x&|dd  D ]}	|d| |	  qnW || q,W ||d	d|  	|d
 S )Nz%(cname)s(%(fields)s)   P      )indentwidthTr    z,
)cnameZfields)
type__name__lensortedr   pprintZpformat
splitlinesappendjoin)
r   resultr#   stringZ	alignmentZfieldr!   linesinnerliner   r   r   __repr__@   s    

zObjectModel.__repr__c             C   s
   || _ | S )N)r   )r   r   r   r   r   __call__S   s    zObjectModel.__call__Nc             C   s   | |S )Nr   )r   r   clsr   r   r   __get__W   s    zObjectModel.__get__c             C   s   ||   kS )N)r   )r   namer   r   r   __contains__a   s    zObjectModel.__contains__)maxsizec             C   s   dd t | D S )z;Get the attributes which are exported by this object model.c             S   s&   g | ]}| tr|ttd  qS )N)
startswithIMPL_PREFIXr&   )r	   r
   r   r   r   r   h   s    z*ObjectModel.attributes.<locals>.<listcomp>)dir)r   r   r   r   r   d   s    zObjectModel.attributesc             C   s.   ||   krt| t| S tj| j|ddS )zLook up the given *name* in the current model

        It should return an AST or an interpreter object,
        but if the name is not found, then an AttributeInferenceError will be raised.
        )target	attributeN)r   getattrr9   r   AttributeInferenceErrorr   )r   r5   r   r   r   lookupk   s    zObjectModel.lookup)N)r%   
__module____qualname__r   r1   r2   r4   r6   r   r   r?   r   r   r   r   r   <   s   

r   c               @   s   e Zd Zdd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zedd ZdS )ModuleModelc             C   s   t jj}|jdS )N__dict__)astroidMANAGERbuiltins_moduleZspecial_attributesr?   )r   builtins_ast_moduler   r   r   	_builtinsx   s    zModuleModel._builtinsc             C   s   |   S )N)rH   )r   r   r   r   attr_builtins|   s    zModuleModel.attr_builtinsc                sJ    j jstj j dd fdd j jD }tj j d}|| |S )N__path__)r;   r<   c                s2   g | ]*}t j|d s|n
tj| jdqS )z__init__.py)r   r   )r   r   endswithospathdirnamer   )r	   rM   )r   r   r   r      s   z-ModuleModel.attr___path__.<locals>.<listcomp>)r   )r   packager   r>   rM   r   Listr   )r   Z	path_objsZ	containerr   )r   r   attr___path__   s    

zModuleModel.attr___path__c             C   s   t j| jj| jdS )N)r   r   )r   r   r   r5   )r   r   r   r   attr___name__   s    zModuleModel.attr___name__c             C   s   t j| jj| jdS )N)r   r   )r   r   r   doc)r   r   r   r   attr___doc__   s    zModuleModel.attr___doc__c             C   s   t j| jj| jdS )N)r   r   )r   r   r   file)r   r   r   r   attr___file__   s    zModuleModel.attr___file__c             C   s   t | j| jjS )N)r   r   globals)r   r   r   r   attr___dict__   s    zModuleModel.attr___dict__c             C   s&   | j jsd}n| j j}tj|| j dS )N )r   r   )r   rO   r5   r   r   )r   r   r   r   r   attr___package__   s    zModuleModel.attr___package__c             C   s   t  S )N)r   Unknown)r   r   r   r   attr___spec__   s    zModuleModel.attr___spec__c             C   s   t  S )N)r   r[   )r   r   r   r   attr___loader__   s    zModuleModel.attr___loader__c             C   s   t  S )N)r   r[   )r   r   r   r   attr___cached__   s    zModuleModel.attr___cached__N)r%   r@   rA   rH   propertyrI   rQ   rR   rT   rV   rX   rZ   r\   r]   r^   r   r   r   r   rB   w   s   rB   c               @   s   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	e	Z
edd Zedd Zedd Zedd ZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZ eZ!eZ"eZ#dS )FunctionModelc             C   s   t j| jj| jdS )N)r   r   )r   r   r   r5   )r   r   r   r   rR      s    zFunctionModel.attr___name__c             C   s   t j| jj| jdS )N)r   r   )r   r   r   rS   )r   r   r   r   rT      s    zFunctionModel.attr___doc__c             C   s   t j| j | jdS )N)r   r   )r   r   r   qname)r   r   r   r   attr___qualname__   s    zFunctionModel.attr___qualname__c             C   s:   | j }|jjstjd |dS tj|d}||jj |S )N)r   r   )r   )r   argsdefaultsr   r   Tupler   )r   funcZdefaults_objr   r   r   attr___defaults__   s    zFunctionModel.attr___defaults__c                s   t j| jd | jjsd }n| jj}| jj}tt|jp:g |jt|j	|j
}dd |D }|jrp|j||j< |jr|j||j< |r||d<  fdd| D } |  S )N)r   c             S   s   i | ]\}}|r||j qS r   )r5   )r	   argZ
annotationr   r   r   
<dictcomp>   s   z6FunctionModel.attr___annotations__.<locals>.<dictcomp>returnc                s"   g | ]\}}t j| d |fqS ))r   )r   r   )r	   keyr   )r
   r   r   r      s   z6FunctionModel.attr___annotations__.<locals>.<listcomp>)r   r   r   returnsrc   	itertoolschainr   annotations
kwonlyargsZkwonlyargs_annotationsZvarargannotationZvarargZkwargannotationZkwargitemsr   )r   rl   rc   Zpair_annotationsro   rq   r   )r
   r   attr___annotations__   s(    

z"FunctionModel.attr___annotations__c             C   s   t j| jdS )N)r   )r   r   r   )r   r   r   r   rX      s    zFunctionModel.attr___dict__c             C   sB   dd }| j j}tj| j d}t|||}|t|  |S )Nc          	   s   sX   xR| j D ]H}y| |j}W n tjk
r4   wY nX tj|j|d}||fV  qW d S )N)r   )rp   Zdefault_valuer5   r   Z	NoDefaultr   r   )rc   r   rh   defaultr5   r   r   r   _default_args  s    z8FunctionModel.attr___kwdefaults__.<locals>._default_args)r   )r   rc   r   r   dictr   r   rq   )r   rt   rc   r
   rd   r   r   r   attr___kwdefaults__  s    
z!FunctionModel.attr___kwdefaults__c             C   s   t | j  S )N)r   r   r   rootra   )r   r   r   r   attr___module__  s    zFunctionModel.attr___module__c                s:   ddl m  | jG  fddd j}|| j| jdS )Nr   )basesc                   s8   e Zd ZdZdd Zd	 fdd	ZefddZdS )
z9FunctionModel.attr___get__.<locals>.DescriptorBoundMethodzFBound method which knows how to understand calling descriptor binding.c             S   s   dS )Nr   r   )r   r   r   r   implicit_parameters!  s    zMFunctionModel.attr___get__.<locals>.DescriptorBoundMethod.implicit_parametersNc             3   s   t |jdkrtjd| |dt|}t|jd j|d}|tj	krXtjd| |dt
 jrnV  d S jjjjj|d}|jjjj  |} j||dV  d S )	Nr   z(Invalid arguments for descriptor binding)r;   r   r   )r   zInvalid class inferred)r5   rS   lineno
col_offsetr   )proxybound)r&   rc   r   ZInferenceError
contextmodZcopy_contextnextZinferrD   ZUninferable
isinstanceBoundMethod	__class__r5   rS   r{   r|   r   ZbodyZ
decoratorsrl   ZUnboundMethod)r   callerr   r3   new_funcr}   )ry   rf   r   r   infer_call_result&  s,    


zKFunctionModel.attr___get__.<locals>.DescriptorBoundMethod.infer_call_resultc                sF    j j  }|tjdd tj j jd}|j|g g g g d |S )a  Overwrite the underlying args to match those of the underlying func

                Usually the underlying *func* is a function/method, as in:

                    def test(self):
                        pass

                This has only the *self* parameter but when we access test.__get__
                we get a new object which has two parameters, *self* and *type*.
                r$   )r5   )r   )rc   rd   rp   Zkw_defaultsro   )rc   copyr*   rD   Z
AssignNameZ	Argumentsr   r   )r   ZparamsZ	arguments)rf   r   r   rc   L  s    z>FunctionModel.attr___get__.<locals>.DescriptorBoundMethod.args)N)r%   r@   rA   __doc__rz   r   r_   rc   r   )ry   rf   r   r   DescriptorBoundMethod  s   &r   )r}   r~   )rD   ry   r   r   )r   r   r   )ry   rf   r   attr___get__  s    GzFunctionModel.attr___get__c             C   s   t  S )N)r   r[   )r   r   r   r   attr___ne__h  s    zFunctionModel.attr___ne__N)$r%   r@   rA   r_   rR   rT   rb   rg   rr   rX   Zattr___globals__rv   rx   r   r   Zattr___subclasshook__Zattr___str__Zattr___sizeof__Zattr___setattr___Zattr___repr__Zattr___reduce__Zattr___reduce_ex__Zattr___new__Zattr___lt__Zattr___eq__Zattr___gt__Zattr___format__Zattr___delattr___Zattr___getattribute__Zattr___hash__Zattr___init__Zattr___dir__Zattr___call__attr___class__Zattr___closure__Zattr___code__r   r   r   r   r`      s@   
!Pr`   c               @   s   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd ZdS )
ClassModelc             C   s   t | j  S )N)r   r   r   rw   ra   )r   r   r   r   rx     s    zClassModel.attr___module__c             C   s   t | jjS )N)r   r   r   r5   )r   r   r   r   rR     s    zClassModel.attr___name__c             C   s   t | j S )N)r   r   r   ra   )r   r   r   r   rb     s    zClassModel.attr___qualname__c             C   s   t | jjS )N)r   r   r   rS   )r   r   r   r   rT     s    zClassModel.attr___doc__c             C   s>   | j jstj| j dd| j  }tj| j d}|| |S )N__mro__)r;   r<   )r   )r   newstyler   r>   mror   re   r   )r   r   r
   r   r   r   attr___mro__  s    

zClassModel.attr___mro__c                sb   | j jstj| j ddddlm} |  G  fddd|j}| j  }|jd d }|||dS )Nr   )r;   r<   r   )ry   c                   s   e Zd Zd fdd	ZdS )z+ClassModel.attr_mro.<locals>.MroBoundMethodNc             3   s    j V  d S )N)r   )r   r   r   )
other_selfr   r   r     s    z=ClassModel.attr_mro.<locals>.MroBoundMethod.infer_call_result)N)r%   r@   rA   r   r   )r   r   r   MroBoundMethod  s   r   )r}   r~   )	r   r   r   r>   rD   ry   r   implicit_metaclasslocals)r   ry   r   r   Z
mro_methodr   )r   r   attr_mro  s    
zClassModel.attr_mroc             C   s0   t  }t }t| j|}|j|d |S )N)elts)r   re   r   ZInferenceContextr   r   Z_inferred_basesr   )r   r
   r   r   r   r   r   attr___bases__  s
    zClassModel.attr___bases__c             C   s   ddl m} || jS )Nr   )helpers)rD   r   object_typer   )r   r   r   r   r   r     s    zClassModel.attr___class__c                s   ddl m} ddl m} jjs0tjjddj j }fdd|	|j
D }tjjd  | G  fd	d
d
|j}j }|jd d }|||dS )zGet the subclasses of the underlying class

        This looks only in the current module for retrieving the subclasses,
        thus it might miss a couple of them.
        r   )ry   )scoped_nodes__subclasses__)r;   r<   c                s$   g | ]}|j kr| r|qS r   )r   Zis_subtype_of)r	   r3   )ra   r   r   r   r     s   z2ClassModel.attr___subclasses__.<locals>.<listcomp>)r   c                   s   e Zd Zd fdd	ZdS )z=ClassModel.attr___subclasses__.<locals>.SubclassesBoundMethodNc             3   s
    V  d S )Nr   )r   r   r   )r
   r   r   r     s    zOClassModel.attr___subclasses__.<locals>.SubclassesBoundMethod.infer_call_result)N)r%   r@   rA   r   r   )r
   r   r   SubclassesBoundMethod  s   r   )r}   r~   )rD   ry   r   r   r   r   r>   ra   rw   Znodes_of_classZClassDefr   rP   r   r   r   r   )r   ry   r   rw   classesr   r   Zsubclasses_methodr   )r
   ra   r   r   attr___subclasses__  s    



zClassModel.attr___subclasses__c             C   s   t j| jdS )N)r   )r   r   r   )r   r   r   r   rX     s    zClassModel.attr___dict__N)r%   r@   rA   r_   rx   rR   rb   rT   r   r   r   r   r   rX   r   r   r   r   r     s   "r   c               @   s<   e Zd Zedd Zedd Zedd Zedd Zd	S )

SuperModelc             C   s   | j jS )N)r   Zmro_pointer)r   r   r   r   attr___thisclass__  s    zSuperModel.attr___thisclass__c             C   s   | j jS )N)r   Z_self_class)r   r   r   r   attr___self_class__  s    zSuperModel.attr___self_class__c             C   s   | j jS )N)r   r$   )r   r   r   r   attr___self__  s    zSuperModel.attr___self__c             C   s   | j jS )N)r   _proxied)r   r   r   r   r     s    zSuperModel.attr___class__N)r%   r@   rA   r_   r   r   r   r   r   r   r   r   r     s   r   c               @   s<   e Zd Zedd Zedd Zedd ZeZeZeZ	dS )UnboundMethodModelc             C   s   ddl m} || jS )Nr   )r   )rD   r   r   r   )r   r   r   r   r   r     s    z!UnboundMethodModel.attr___class__c             C   s   | j jS )N)r   r   )r   r   r   r   attr___func__  s    z UnboundMethodModel.attr___func__c             C   s   t jd | jdS )N)r   r   )r   r   r   )r   r   r   r   r     s    z UnboundMethodModel.attr___self__N)
r%   r@   rA   r_   r   r   r   Zattr_im_funcZattr_im_classZattr_im_selfr   r   r   r   r     s   r   c               @   s$   e Zd Zedd Zedd ZdS )BoundMethodModelc             C   s
   | j jjS )N)r   r   )r   r   r   r   r     s    zBoundMethodModel.attr___func__c             C   s   | j jS )N)r   r~   )r   r   r   r   r     s    zBoundMethodModel.attr___self__N)r%   r@   rA   r_   r   r   r   r   r   r   r     s   r   c                   s4   e Zd Z fddZedd Zedd Z  ZS )GeneratorModelc       	         sl   t t| j| f||}tjjd }xB|j D ]4\}}|d }|fdd}tt	|t
| t| q0W |S )N	generatorr   c             S   s   |S )Nr   )r3   methr   r   r   <lambda>!  s    z(GeneratorModel.__new__.<locals>.<lambda>)superr   __new__rD   rE   rF   r   rq   setattrr$   r9   r_   )	r3   rc   kwargsretr   r5   r   methodpatched)r   r   r   r     s    zGeneratorModel.__new__c             C   s   t j| jjj| jdS )N)r   r   )r   r   r   r   r5   )r   r   r   r   rR   '  s    zGeneratorModel.attr___name__c             C   s   t j| jjj| jdS )N)r   r   )r   r   r   r   rS   )r   r   r   r   rT   -  s    zGeneratorModel.attr___doc__)r%   r@   rA   r   r_   rR   rT   __classcell__r   r   )r   r   r     s   r   c                   s   e Zd Z fddZ  ZS )AsyncGeneratorModelc       
         s   t  j| f||}tjj}|d}|d kr8|d}xB|j D ]4\}}|d }|fdd}	tt	|t
| t|	 qDW |S )Nasync_generatorr   r   c             S   s   |S )Nr   )r3   r   r   r   r   r   @  s    z-AsyncGeneratorModel.__new__.<locals>.<lambda>)r   r   rD   rE   rF   getr   rq   r   r$   r9   r_   )
r3   rc   r   r   Zastroid_builtinsr   r5   r   r   r   )r   r   r   r   5  s    

zAsyncGeneratorModel.__new__)r%   r@   rA   r   r   r   r   )r   r   r   4  s   r   c               @   s<   e Zd Zedd Zedd Zedd Zedd Zd	S )
InstanceModelc             C   s   | j jS )N)r   r   )r   r   r   r   r   H  s    zInstanceModel.attr___class__c             C   s   t | j  S )N)r   r   r   rw   ra   )r   r   r   r   rx   L  s    zInstanceModel.attr___module__c             C   s   t | jjS )N)r   r   r   rS   )r   r   r   r   rT   P  s    zInstanceModel.attr___doc__c             C   s   t | j| jjS )N)r   r   Zinstance_attrs)r   r   r   r   rX   T  s    zInstanceModel.attr___dict__N)r%   r@   rA   r_   r   rx   rT   rX   r   r   r   r   r   G  s   r   c               @   s$   e Zd Zedd Zedd ZdS )ExceptionInstanceModelc             C   s(   t d}t j| jd}||f |S )NrY   )r   )r   r   re   r   r   )r   messagerc   r   r   r   	attr_args]  s    
z ExceptionInstanceModel.attr_argsc             C   s   t jj}|tjj }| S )N)rD   rE   rF   typesTracebackTyper%   Zinstantiate_class)r   rG   Ztraceback_typer   r   r   attr___traceback__d  s    z)ExceptionInstanceModel.attr___traceback__N)r%   r@   rA   r_   r   r   r   r   r   r   r   \  s   r   c               @   s   e Zd Zedd ZdS )SyntaxErrorInstanceModelc             C   s
   t dS )NrY   )r   r   )r   r   r   r   	attr_textl  s    z"SyntaxErrorInstanceModel.attr_textN)r%   r@   rA   r_   r   r   r   r   r   r   k  s   r   c               @   s4   e Zd Zedd Zedd Zedd ZeZdS )OSErrorInstanceModelc             C   s
   t dS )NrY   )r   r   )r   r   r   r   attr_filenamer  s    z"OSErrorInstanceModel.attr_filenamec             C   s
   t dS )Nr   )r   r   )r   r   r   r   
attr_errnov  s    zOSErrorInstanceModel.attr_errnoc             C   s
   t dS )NrY   )r   r   )r   r   r   r   attr_strerrorz  s    z"OSErrorInstanceModel.attr_strerrorN)r%   r@   rA   r_   r   r   r   Zattr_filename2r   r   r   r   r   q  s   r   c               @   s$   e Zd Zedd Zedd ZdS )ImportErrorInstanceModelc             C   s
   t dS )NrY   )r   r   )r   r   r   r   	attr_name  s    z"ImportErrorInstanceModel.attr_namec             C   s
   t dS )NrY   )r   r   )r   r   r   r   	attr_path  s    z"ImportErrorInstanceModel.attr_pathN)r%   r@   rA   r_   r   r   r   r   r   r   r     s   r   )zbuiltins.SyntaxErrorzbuiltins.ImportErrorzbuiltins.OSErrorzbuiltins.BlockingIOErrorzbuiltins.BrokenPipeErrorzbuiltins.ChildProcessErrorzbuiltins.ConnectionAbortedErrorzbuiltins.ConnectionErrorzbuiltins.ConnectionRefusedErrorzbuiltins.ConnectionResetErrorzbuiltins.FileExistsErrorzbuiltins.FileNotFoundErrorzbuiltins.InterruptedErrorzbuiltins.IsADirectoryErrorzbuiltins.NotADirectoryErrorzbuiltins.PermissionErrorzbuiltins.ProcessLookupErrorzbuiltins.TimeoutErrorc               @   sD   e Zd Zedd Zdd Zedd Zedd Zed	d
 ZdS )	DictModelc             C   s   | j jS )N)r   r   )r   r   r   r   r     s    zDictModel.attr___class__c                s6   G  fdddt j}t| jj|}||| jdS )z7Generate a bound method that can infer the given *obj*.c                   s   e Zd Zd fdd	ZdS )z@DictModel._generic_dict_attribute.<locals>.DictMethodBoundMethodNc             3   s
    V  d S )Nr   )r   r   r   )r
   r   r   r     s    zRDictModel._generic_dict_attribute.<locals>.DictMethodBoundMethod.infer_call_result)N)r%   r@   rA   r   r   )r
   r   r   DictMethodBoundMethod  s   r   )r}   r~   )rD   r   r   r   r   Zigetattr)r   r
   r5   r   r   r   )r
   r   _generic_dict_attribute  s    z!DictModel._generic_dict_attributec             C   sz   g }t j| jd}x8| jjD ],\}}t j|d}|||f || qW |j|d ddlm} |	|}| 
|dS )N)r   )r   r   )objectsrq   )r   rP   r   rq   re   r   r*   rD   r   Z	DictItemsr   )r   Zelemsr
   rk   r   r   r   r   r   r   
attr_items  s    
zDictModel.attr_itemsc             C   sN   dd | j jD }tj| j d}|j|d ddlm} ||}| |dS )Nc             S   s   g | ]\}}|qS r   r   )r	   rk   _r   r   r   r     s    z'DictModel.attr_keys.<locals>.<listcomp>)r   )r   r   )r   r   )	r   rq   r   rP   r   rD   r   ZDictKeysr   )r   r   r
   r   r   r   r   	attr_keys  s    
zDictModel.attr_keysc             C   sL   dd | j jD }tj| j d}|| ddlm} ||}| |dS )Nc             S   s   g | ]\}}|qS r   r   )r	   r   r   r   r   r   r     s    z)DictModel.attr_values.<locals>.<listcomp>)r   r   )r   r   )	r   rq   r   rP   r   rD   r   Z
DictValuesr   )r   r   r
   r   r   r   r   attr_values  s    

zDictModel.attr_valuesN)	r%   r@   rA   r_   r   r   r   r   r   r   r   r   r   r     s
   
r   )r   rm   r(   rL   r   	functoolsr   rD   r   r   r   r   r9   r   r   rB   r`   r   r   r   r   r   r   r   r   r   r   r   ZBUILTIN_EXCEPTIONSr   r   r   r   r   <module>   sZ   ;L Ag
