U
    •Ê¹jö"  ã                   @   sÎ   d dl Z d dlmZmZ d dlmZmZmZ d dl	m
Z
 d dlmZmZmZmZmZ ddlmZmZmZ dd	d
dg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ƒ ZG dd„ deƒZdS )é    N)ÚABCÚabstractmethod)Ú_getattributeÚ_PicklerÚwhichmodule)Ú
ModuleType)ÚAnyÚDictÚListÚOptionalÚTupleé   )ÚdemangleÚget_mangle_prefixÚ
is_mangledÚObjNotFoundErrorÚObjMismatchErrorÚImporterÚOrderedImporterc                   @   s   e Zd ZdZdS )r   zHRaised when an importer cannot find an object by searching for its name.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/package/importer.pyr      s   c                   @   s   e Zd ZdZdS )r   z]Raised when an importer found a different object with the same name as the user-provided one.Nr   r   r   r   r   r      s   c                   @   sh   e Zd ZU dZeeef ed< eeedœdd„ƒZ	de
ee eeef dœdd	„Ze
eedœd
d„ZdS )r   ad  Represents an environment to import modules from.

    By default, you can figure out what module an object belongs by checking
    __module__ and importing the result using __import__ or importlib.import_module.

    torch.package introduces module importers other than the default one.
    Each PackageImporter introduces a new namespace. Potentially a single
    name (e.g. 'foo.bar') is present in multiple namespaces.

    It supports two main operations:
        import_module: module_name -> module object
        get_name: object -> (parent module name, name of obj within module)

    The guarantee is that following round-trip will succeed or throw an ObjNotFoundError/ObjMisMatchError.
        module_name, obj_name = env.get_name(obj)
        module = env.import_module(module_name)
        obj2 = getattr(module, obj_name)
        assert obj1 is obj2
    Úmodules©Úmodule_nameÚreturnc                 C   s   dS )zvImport `module_name` from this environment.

        The contract is the same as for importlib.import_module.
        Nr   ©Úselfr   r   r   r   Úimport_module3   s    zImporter.import_moduleN©ÚobjÚnamer   c                    sZ  ˆ dkrb|rbt j t|ƒ¡dkrbt|ddƒ}|dk	rbz|ƒ }t|tƒrJ|‰ W n tk
r`   Y nX ˆ dkrvt|ddƒ‰ ˆ dkr„|j‰ ˆ 	|ˆ ¡}t
|ƒ}zˆ |¡}t|ˆ ƒ\}}	W n4 tttfk
rè   t|› d|› dˆ › �ƒd‚Y nX ||krú|ˆ fS ‡ ‡fdd„}
|
|ƒ\}}}|
|ƒ\}}}d|› d	|› d
|› d|› d|› d|› d�}t|ƒ‚dS )am  Given an object, return a name that can be used to retrieve the
        object from this environment.

        Args:
            obj: An object to get the the module-environment-relative name for.
            name: If set, use this name instead of looking up __name__ or __qualname__ on `obj`.
                This is only here to match how Pickler handles __reduce__ functions that return a string,
                don't use otherwise.
        Returns:
            A tuple (parent_module_name, attr_name) that can be used to retrieve `obj` from this environment.
            Use it like:
                mod = importer.import_module(parent_module_name)
                obj = getattr(mod, attr_name)

        Raises:
            ObjNotFoundError: we couldn't retrieve `obj by name.
            ObjMisMatchError: we found a different object with the same name as `obj`.
        NÚ
__reduce__r   z was not found as Ú.c                    sP   ˆ d k	st ‚ˆ | ˆ ¡}t|ƒ}|r,t|ƒnd}|rBdt|ƒ› �nd}|||fS )Nzthe current Python environmentzthe importer for z'sys_importer')ÚAssertionErrorr   r   r   )r$   r   Zis_mangled_ÚlocationZimporter_name©r%   r!   r   r   Úget_obj_infoq   s    ÿ
ýÿýz'Importer.get_name.<locals>.get_obj_infoz

The object provided is from 'z', which is coming from z.
However, when we import 'z', it's coming from z@.
To fix this, make sure this 'PackageExporter's importer lists z before )r   ÚdispatchÚgetÚtypeÚgetattrÚ
isinstanceÚstrÚ	Exceptionr   r   r   r"   r   ÚImportErrorÚKeyErrorÚAttributeErrorr   r   )r!   r$   r%   ÚreduceÚrvZorig_module_namer   ÚmoduleÚobj2Ú_r+   Zobj_module_nameZobj_locationZobj_importer_nameZobj2_module_nameZobj2_locationZobj2_importer_nameÚmsgr   r*   r   Úget_name;   s@     

ÿþ(ÿzImporter.get_namec              	   C   s„   t |ddƒ}|dk	r|S | j ¡  ¡ D ]X\}}|dks&|dks&|dkrHq&z t||ƒd |krf|W   S W q& tk
r|   Y q&X q&dS )a  Find the module name an object belongs to.

        This should be considered internal for end-users, but developers of
        an importer can override it to customize the behavior.

        Taken from pickle.py, but modified to exclude the search into sys.modules
        r   NÚ__main__Z__mp_main__r   )r/   r   ÚcopyÚitemsr   r5   )r!   r$   r%   r   r8   r   r   r   r   Œ   s"    ÿþýzImporter.whichmodule)N)r   r   r   r   r	   r1   r   Ú__annotations__r   r"   r   r   r   r<   r   r   r   r   r   r      s   
 Qc                   @   s0   e Zd ZdZedœdd„Zeeedœdd„ZdS )	Ú_SysImporterz;An importer that implements the default behavior of Python.)r   c                 C   s
   t  |¡S ©N)Ú	importlibr"   r    r   r   r   r"   ­   s    z_SysImporter.import_moduler#   c                 C   s
   t ||ƒS rB   )Ú_pickle_whichmodule)r!   r$   r%   r   r   r   r   °   s    z_SysImporter.whichmoduleN)r   r   r   r   r1   r"   r   r   r   r   r   r   rA   ª   s   rA   c                   @   sB   e Zd ZdZdd„ Zdd„ Zeedœdd„Ze	eed	œd
d„Z
dS )r   z—A compound importer that takes a list of importers and tries them one at a time.

    The first importer in the list that returns a result "wins".
    c                 G   s   t |ƒ| _d S rB   )ÚlistÚ
_importers)r!   Úargsr   r   r   Ú__init__½   s    zOrderedImporter.__init__c                 C   s6   t |ddƒsdS t|dƒsdS t|dƒs,dS |jdkS )aà  Returns true iff this module is an empty PackageNode in a torch.package.

        If you intern `a.b` but never use `a` in your code, then `a` will be an
        empty module with no source. This can break cases where we are trying to
        re-package an object after adding a real dependency on `a`, since
        OrderedImportere will resolve `a` to the dummy package and stop there.

        See: https://github.com/pytorch/pytorch/pull/71520#issuecomment-1029603769
        Z__torch_package__FÚ__path__Ú__file__TN)r/   ÚhasattrrJ   )r!   r8   r   r   r   Ú_is_torchpackage_dummyÀ   s    


z&OrderedImporter._is_torchpackage_dummyr   c                 C   sŒ   d }| j D ]f}t|tƒs&t|› d�ƒ‚z"| |¡}|  |¡r@W q
|W   S  tk
rn } z|}W 5 d }~X Y q
X q
|d k	r€|‚nt|ƒ‚d S )NzP is not a Importer. All importers in OrderedImporter must inherit from Importer.)rF   r0   r   Ú	TypeErrorr"   rL   ÚModuleNotFoundError)r!   r   Zlast_errÚimporterr8   Úerrr   r   r   r"   Ò   s     

ÿ


zOrderedImporter.import_moduler#   c                 C   s,   | j D ] }| ||¡}|dkr|  S qdS )Nr=   )rF   r   )r!   r$   r%   rO   r   r   r   r   r   ç   s
    

zOrderedImporter.whichmoduleN)r   r   r   r   rH   rL   r1   r   r"   r   r   r   r   r   r   r   ·   s
   )rC   Úabcr   r   Úpickler   r   r   rD   Útypesr   Útypingr   r	   r
   r   r   Z	_manglingr   r   r   Ú__all__r2   r   r   r   rA   Zsys_importerr   r   r   r   r   Ú<module>   s    
