o
    i                  
   @   s\  d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	m	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZmZ d dlZd d	lmZmZmZ d d
lmZ d dl m!Z! ddl"m#Z# ddl$m%Z%m&Z& ddl'm(Z(m)Z)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 e6dej7Z8eG dd dZ9G dd dej:Z;G dd dej<j=Z>G dd dej<j=Z?de@de@fddZAd e@de@fd!d"ZBd#e@d$eeC defd%d&ZDd'e;d#e@d(e@d)eEd*e@f
d+d,ZFe jGe;e jHd-D ]0\ZIZJeKej:eIdZLeLdur+eLjMdur+eLjMZNeNOd.d/ZNeNOd0d1ZNd2eI d3d4 eN eJ_MqdS )5    N)deque)	dataclassfield)datetime)chain)Path)AnyDictListNoReturnOptionalTupleUnion)quoteunquote)_DEFAULT_CALLBACKNoOpCallbackTqdmCallback)
isfilelike)Response   )	constants)CommitOperationCopyCommitOperationDelete)EntryNotFoundErrorRepositoryNotFoundErrorRevisionNotFoundError)
hf_hub_urlhttp_get)HfApiLastCommitInfoRepoFile)HFValidationErrorhf_raise_for_statushttp_backoffzy
    (^refs\/convert\/\w+)     # `refs/convert/parquet` revisions
    |
    (^refs\/pr\/\d+)          # PR revisions
    c                   @   sX   e Zd ZU dZeed< eed< eed< eed< edddZee ed	< d
efddZ	dS )HfFileSystemResolvedPathzUData structure containing information about a resolved Hugging Face file system path.	repo_typerepo_idrevisionpath_in_repoNF)defaultrepr_raw_revisionreturnc                 C   s~   t j| jd| j }| jr| d| j d| j dS | jt j	kr4| dt
| j d| j dS | d| j dS )N @/)r   REPO_TYPES_URL_PREFIXESgetr&   r'   r,   r)   rstripr(   DEFAULT_REVISIONsafe_revision)self	repo_path r8   \/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/huggingface_hub/hf_file_system.py	unresolve5   s   "z"HfFileSystemResolvedPath.unresolve)
__name__
__module____qualname____doc__str__annotations__r   r,   r   r:   r8   r8   r8   r9   r%   )   s   
 r%   c                       s  e Zd ZdZdZdZddddee dee	edf f fdd	Z
d
ededee dee	ee f fddZdGdedee defddZdGdee ddfddZ			dHdededee dee ddf
ddZdGdedee ddfddZ			dIdede	dee dee ddf
d d!Z	dJded#e	d$e	dee deeeeeef f  f
d%d&Z				"dKdede	d$e	dee d'e	f
d(d)Z fd*d+Z fd,d-Z					dLdedee d.e	d#e	d$e	dee deee eeeeef f f f fd/d0ZdGd1ed2edee ddfd3d4Zdedefd5d6ZdMded$e	dee deeef fd7d8Z d9d: Z!d;d< Z"d=d> Z#dedefd?d@Z$e%dfdN fdAdBZ&e'dCdD Z(dEdF Z)  Z*S )OHfFileSystemaF  
    Access a remote Hugging Face Hub repository as if were a local file system.

    Args:
        token (`str` or `bool`, *optional*):
            A valid user access token (string). Defaults to the locally saved
            token, which is the recommended method for authentication (see
            https://huggingface.co/docs/huggingface_hub/quick-start#authentication).
            To disable authentication, pass `False`.

    Usage:

    ```python
    >>> from huggingface_hub import HfFileSystem

    >>> fs = HfFileSystem()

    >>> # List files
    >>> fs.glob("my-username/my-model/*.bin")
    ['my-username/my-model/pytorch_model.bin']
    >>> fs.ls("datasets/my-username/my-dataset", detail=False)
    ['datasets/my-username/my-dataset/.gitattributes', 'datasets/my-username/my-dataset/README.md', 'datasets/my-username/my-dataset/data.json']

    >>> # Read/write files
    >>> with fs.open("my-username/my-model/pytorch_model.bin") as f:
    ...     data = f.read()
    >>> with fs.open("my-username/my-model/pytorch_model.bin", "wb") as f:
    ...     f.write(data)
    ```
    r.   hfNendpointtokenrD   rE   c                   s<   t  j|i | |ptj| _|| _t||d| _i | _d S )NrC   )	super__init__r   ENDPOINTrD   rE   r   _api_repo_and_revision_exists_cache)r6   rD   rE   argsstorage_options	__class__r8   r9   rG   b   s   zHfFileSystem.__init__r&   r'   r(   r-   c              
   C   s   |||f| j vrqz| jj|||tjd W nK ttfy= } zd|f| j |||f< d|f| j ||d f< W Y d }~n8d }~w ty` } zd|f| j |||f< d| j ||d f< W Y d }~nd }~ww d| j |||f< d| j ||d f< | j |||f S )N)r(   r&   timeoutF)TN)rJ   rI   	repo_infor   HF_HUB_ETAG_TIMEOUTr   r"   r   )r6   r&   r'   r(   er8   r8   r9   _repo_and_revision_existt   s"   

 z%HfFileSystem._repo_and_revision_existpathc                 C   sp  dt t dt t dt t fdd}| |}|std|dd d tj v r@d|vr2td|dd	\}}tj| }ntj	}|
ddkrd
|v r|d
d	\}}d|v rt|}|d ury|d | fv rytd|d}| }n|dd	\}}nd}|t||}| |||\}	}
|	st||
 nd }d|dd d }d|ddd  }|dd }d|dd	d  }|}|}| |||\}	}
|	st|
ttfr|}|}| |||\}	}|	st||
 n1t||
 n+|}d}d
|v r|d
d	\}}|t||}nd }| |||\}	}|	s%td|d ur,|ntj}t|||||dS )Nrevision_in_pathr(   r-   c                 S   s:   |d ur| d ur| |krt d|  d| d|S | }|S )NzRevision specified in path ("z ") and in `revision` argument ("z") are not the same.)
ValueError)rU   r(   r8   r8   r9   %_align_revision_in_path_with_revision   s   zHHfFileSystem.resolve_path.<locals>._align_revision_in_path_with_revisionz0Access to repositories lists is not implemented.r0   r   r   r/   r.      )r,   )r   r?   _strip_protocolNotImplementedErrorsplitr   r1   valuesREPO_TYPES_MAPPINGREPO_TYPE_MODELcountSPECIAL_REFS_REVISION_REGEXsearchgroupsublstripr   rS   _raise_file_not_foundjoin
isinstancer   r"   r4   r%   )r6   rT   r(   rW   r&   r'   rU   matchr)   repo_and_revision_existerrrepo_id_with_namespacepath_in_repo_with_namespacerepo_id_without_namespacepath_in_repo_without_namespace_r8   r8   r9   resolve_path   sx   







zHfFileSystem.resolve_pathc                 C   sR   |s| j   | j  d S | | }|r'| j |d  | |}|sd S d S N)dircacheclearrJ   rp   r:   pop_parentr6   rT   r8   r8   r9   invalidate_cache   s   

zHfFileSystem.invalidate_cacherbmode
block_sizeHfFileSystemFilec                 K   sL   d|v rt d|dkrt| |f|||d|S t| |f|||d|S )Naz/Appending to remote files is not yet supported.r   )ry   r(   rz   )rZ   HfFileSystemStreamFiler{   )r6   rT   ry   r(   rz   kwargsr8   r8   r9   _open   s
   zHfFileSystem._openc              
   K   sR   | j ||d}| jj|j|j| j|j|j|d|dd | j	|
 d d S )Nr(   commit_messagecommit_description)r)   r'   rE   r&   r(   r   r   rT   )rp   rI   delete_filer)   r'   rE   r&   r(   r2   rw   r:   )r6   rT   r(   r~   resolved_pathr8   r8   r9   _rm   s   	zHfFileSystem._rmF	recursivemaxdepthc              
      s    j ||d} j||||d} fdd|D }dd |D }	d| d}
|
|r+dnd	7 }
|
|d ur9d
| dnd	7 }
 jj|j|j j|	|j|d|
|dd  j	|
 d d S )Nr   )r   r   r(   c                    s"   g | ]}  |s |jqS r8   )isdirrp   r)   ).0rT   r6   r8   r9   
<listcomp>     " z#HfFileSystem.rm.<locals>.<listcomp>c                 S   s   g | ]}t |d qS ))r)   )r   )r   r)   r8   r8   r9   r         zDelete  zrecursively r.   zup to depth r   r   )r'   r&   rE   
operationsr(   r   r   r   )rp   expand_pathrI   create_commitr'   r&   rE   r(   r2   rw   r:   )r6   rT   r   r   r(   r~   r   pathspaths_in_repor   r   r8   r   r9   rm   s"   
	zHfFileSystem.rmTdetailrefreshc                    s   | j  |d}|  d|i|}z| j f||d|}W n4 tyS   |js.t d | j|  f||d|} fdd|D }t|dkrQt d Y nw |rX|S dd |D S )	z!List the contents of a directory.r   expand_info)r   r(   Nc                       g | ]
}|d   kr|qS namer8   r   or   r8   r9   r   "      z#HfFileSystem.ls.<locals>.<listcomp>r   c                 S   s   g | ]}|d  qS r   r8   r   r8   r8   r9   r   %  s    )rp   r:   _ls_treer   r)   re   ru   len)r6   rT   r   r   r(   r~   r   outr8   r   r9   ls  s   

zHfFileSystem.lsr   c              	      sN  j ||d}| }t|j|j|jd|jd }g }|jv r|sшj| }	||	 g }
|rgt	dd |	D }|rg|
 }|d jvrO|
|d  nj|d  }	||	 |dd |	D  |s<g }|rtfdd|D }|rx|
s||r|rtj|
| }|d	s||ks|t|
|v r|d	n|  fd
d|D }jD ]}| d	 rj|d  qj d  |j |d||d |S jj|j|j|||j|jd}|D ]A}t|tr|d	 |j |jd|j|j|j|jd}n|d	 |j dd|j |jd}|d }j!|g | || q|S )Nr   r.   r)   r,   c                 S      g | ]
}|d  dkr|qS type	directoryr8   r   	path_infor8   r8   r9   r   B  r   z)HfFileSystem._ls_tree.<locals>.<listcomp>r   c                 S   r   r   r8   r   r8   r8   r9   r   L  r   c                    s&   g | ]}|d  du r  |d qS )last_commitNr   )ru   r   r   r8   r9   r   R  s   & r0   c                    s"   g | ]}|d    d s|qS )r   r0   )
startswithr   )common_pathr8   r9   r   `  r   T)r   r   r(   r   )r   expandr(   r&   filer   sizer   blob_idlfsr   securityr   r   r   r   r   tree_idr   )"rp   r:   r%   r&   r'   r(   r,   rr   extendr   popleftappendosrT   commonprefixendswithr   r3   ru   r   rt   r   rI   list_repo_treer)   rg   r!   r   r   r   r   r   r   
setdefault)r6   rT   r   r   r(   r   r   	root_pathr   cached_path_infosdirs_not_in_dircachedirs_to_visitdir_infodirs_not_expandedcommon_prefixcached_pathtreer   cache_path_infoparent_pathr8   )r   r6   r9   r   '  s   




(
zHfFileSystem._ls_treec                 /   sR    d| ddi|}| j|| dd }t j|g|R i |E d H  d S Nr   r   Fr(   r   )r2   rp   r:   rF   walk)r6   rT   rK   r~   rM   r8   r9   r     s   $zHfFileSystem.walkc                    s@   d| ddi|}| j|| dd }t j|fi |S r   )r2   rp   r:   rF   globr6   rT   r~   rM   r8   r9   r     s   zHfFileSystem.globwithdirsc                    s  |rt  j|f|||||d|S | j||d}| }d|i|}z| j|fd||jd| W n tyR   | j|fd|i|d dkrN|i i ni  Y n+w |s]d	d
  D  n| j|fd|ji|}	|	d dkrt|	g  n  dd  D  t }
|s|
S  fdd|
D S )N)r   r   r   r   r(   r   r   T)r   r   r(   r(   r   r   c                 S   s   g | ]
}|d  dkr|qS r   r8   r   r8   r8   r9   r     r   z%HfFileSystem.find.<locals>.<listcomp>r   c                 S   s   i | ]}|d  |qS r   r8   r   r8   r8   r9   
<dictcomp>  r   z%HfFileSystem.find.<locals>.<dictcomp>c                       i | ]}| | qS r8   r8   )r   r   r   r8   r9   r     r   )	rF   findrp   r:   r   r(   r   infosorted)r6   rT   r   r   r   r   r(   r~   r   r   namesrM   r   r9   r     s8   

 
zHfFileSystem.findpath1path2c                 K   s,  | j ||d}| j ||d}|j|jko|j|jk}|rEd| d| }| jj|j|j|j|d||ddt|j|j|jdgd n?| j	|d	|jd}	|	
 }
W d    n1 s]w   Y  d| d| }| jj|
|j|j| j|j|j|d||dd
 | j| d | j| d d S )Nr   zCopy z to r   r   r.   )src_path_in_repor)   src_revision)r'   r&   r(   r   r   r   rx   path_or_fileobjr)   r'   rE   r&   r(   r   r   r   )rp   r&   r'   rI   r   r(   r2   r   r)   openreadupload_filerE   rw   r:   )r6   r   r   r(   r~   resolved_path1resolved_path2	same_repor   fcontentr8   r8   r9   cp_file  sF   




zHfFileSystem.cp_filec                 K   s   | j |fi |}|d d S )Nr   dater   )r6   rT   r~   r   r8   r8   r9   modified  s   zHfFileSystem.modifiedc                    s  | j |d}| |dd}|js<ddd |r;| jj|j|j|jdd }i  d t	|j
|j|jd	d
 nd  | }|sQ|| jvrQ| j|dd || jv rmfdd| j| D }	|	sitd  |	d  |s} d u s}|rڈ rڈ d d u r| jj|j|j||j|jd}
|
std  |
d }t|j|j|jd|jd }t|tr|d |j |jd|j|j|j|jd n|d |j dd|j|jd |sڇ fdddD   d usJ  S )Nr   r   Tr   r   )r   r   r   )r&   r(   )oidtitler   )r   r   Fr   c                    r   r   r8   r   r   r8   r9   r     r   z%HfFileSystem.info.<locals>.<listcomp>r   )r   r(   r&   r.   r   r0   r   r   r   c                    r   r8   r8   )r   kr   r8   r9   r   8  r   z%HfFileSystem.info.<locals>.<dictcomp>)rp   r:   r2   r)   rI   list_repo_commitsr'   r&   r(   r    	commit_idr   
created_atru   rr   r   re   get_paths_infor%   r,   rg   r!   rT   r   r   r   r   r   r   )r6   rT   r   r(   r~   r   r   r   r   out1
paths_infor   r   r8   )r   rT   r9   r     s   


 

zHfFileSystem.infoc                 K   s2   z| j |fi i |ddi W dS    Y dS )z!Is there a file at the given pathr   FTr   r   r8   r8   r9   exists<  s
   zHfFileSystem.existsc                 C   s.   z| j |ddd dkW S  ty   Y dS w )zIs this entry directory-like?Fr   r   r   )r   OSErrorrv   r8   r8   r9   r   E  s
   zHfFileSystem.isdirc                 C   s&   z| j |ddd dkW S    Y dS )zIs this entry file-like?Fr   r   r   r   rv   r8   r8   r9   isfileL  s   zHfFileSystem.isfilec                 C   sB   |  |}t|j|j|j|j| jd}| |r|ddd}|S )z"Get the HTTP URL of the given path)r&   r(   rD   z	/resolve/z/tree/r   )	rp   r   r'   r)   r&   r(   rD   r   replace)r6   rT   r   urlr8   r8   r9   r   S  s   

zHfFileSystem.urlc              
      sb  | d}t| dh }t|ttfrt|dkr)t j||f||d|S t	|r0|}n| 
|r>tj|dd dS t|ttfrPtjtj|dd d}|du r]t|d}d}| }	| j||d	}
| j||d	d
 }|| z2tt|
j|
j|
j|
j| jd|||d| j t|tr|jndd | |	 W |r|!  dS dS |r|!  w w )z!Copy single remote file to local.r(   r   )callbackoutfileT)exist_okNFwbr   r   r'   r(   filenamer&   rD   )r   	temp_filedisplayed_filenameexpected_sizeresume_sizeheaders	_tqdm_bar)"r2   setkeysrg   r   r   r   rF   get_filer   r   r   makedirsr?   r   rT   dirnamer   tellrp   r   set_sizer   r   r'   r(   r)   r&   rD   rI   _build_hf_headerstqdmseekclose)r6   rpathlpathr   r   r~   r(   unhandled_kwargs
close_fileinitial_posresolve_remote_pathr   rM   r8   r9   r  a  sR   




zHfFileSystem.get_filec                 C      t d)zA context within which files are committed together upon exit

        Requires the file class to implement `.commit()` and `.discard()`
        for the normal and exception cases.
        (Transactional commits are not supported.rZ   r   r8   r8   r9   transaction  s   	zHfFileSystem.transactionc                 C   r  )z@Begin write transaction for deferring files, non-context versionr  r  r   r8   r8   r9   start_transaction  s   zHfFileSystem.start_transactionrq   )rx   NN)FNN)TFN)FFNT)NFFFN)FNr-   N)+r;   r<   r=   r>   root_markerprotocolr   r?   r   boolrG   r   	ExceptionrS   r%   rp   rw   intr   r   r   r
   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  propertyr  r  __classcell__r8   r8   rM   r9   rA   ?   s    
L



h		 ')(M	4

rA   c                       s   e Zd Zddededee f fddZ fddZd	ed
ede	fddZ
dddZddeddfddZd fdd	ZdefddZ  ZS )r{   NfsrT   r(   c              
      s   z
|j ||d| _W n ty' } zd|ddv r"t| d| d }~ww |dddkr;|j| j dd| _t j|| j fi | |  d S )	Nr   wry   r.   B.
Make sure the repository and revision exist before writing data.rx   Fr   )	rp   r   FileNotFoundErrorr2   r   r:   detailsrF   rG   )r6   r!  rT   r(   r~   rR   rM   r8   r9   rG     s    zHfFileSystemFile.__init__c                       t | dsd S t  S Nr   hasattrrF   __del__r   rM   r8   r9   r*       

zHfFileSystemFile.__del__startendr-   c                 C   sl   dd| d|d  i| j j }t| jj| jj| jj| jj| j j	d}t
d||dtjd}t| |jS )	Nrangezbytes=-r   r   GETi  i  i  )r  retry_on_status_codesrO   )r!  rI   r
  r   r   r'   r(   r)   r&   rD   r$   r   HF_HUB_DOWNLOAD_TIMEOUTr#   r   )r6   r,  r-  r  r   rr8   r8   r9   _fetch_range  s(   
zHfFileSystemFile._fetch_rangec                 C   s   t jddd| _d S )Nzhffs-F)prefixdelete)tempfileNamedTemporaryFiler   r   r8   r8   r9   _initiate_upload  s   z!HfFileSystemFile._initiate_uploadFfinalc                 C   s   | j d | j  }| j| |rN| j  | jjj| jj	| j
j| j
j| jj| j
j| j
j| jd| jdd t| jj	 | jj| j
 d d S d S )Nr   r   r   r   r   )bufferr  r   r   writer  r!  rI   r   r   r   r)   r'   rE   r&   r(   r~   r2   r   removerw   r:   )r6   r;  blockr8   r8   r9   _upload_chunk  s(   





zHfFileSystemFile._upload_chunkr   c                    sl   | j dkr0|du s|dkr0| jdkr0| jj| jddd}| W  d   S 1 s+w   Y  t |S )a)  Read remote file.

        If `length` is not provided or is -1, the entire file is downloaded and read. On POSIX systems and if
        `hf_transfer` is not enabled, the file is loaded in memory directly. Otherwise, the file is downloaded to a
        temporary file and read from there.
        rx   Nr   r   )rz   )ry   locr!  r   rT   r   rF   )r6   lengthr   rM   r8   r9   r     s
   $ zHfFileSystemFile.readc                 C      | j | jS rq   r!  r   rT   r   r8   r8   r9   r        zHfFileSystemFile.urlrq   r  )Fr   )r;   r<   r=   rA   r?   r   rG   r*  r  bytesr5  r:  r  r@  r   r   r   r8   r8   rM   r9   r{     s     
r{   c                       s   e Zd Z				ddedededee d	ed
ef fddZddedefddZddefddZ	defddZ
 fddZdd Z  ZS )r}   rx   Nr   noner!  rT   ry   r(   rz   
cache_typec           	   
      s   |dkrt d| |dkrt d| d|v r"t d| dz
|j||d| _W n" tyN } zd|d	d
v rDt| d|W Y d }~nd }~ww | j d d| _t j|| j f|||d| d | _	|  d S )Nr   z:HfFileSystemStreamFile only supports block_size=0 but got rH  z?HfFileSystemStreamFile only supports cache_type='none' but got r"  z;HfFileSystemStreamFile only supports reading but got mode=''r   ry   r.   r#  )r   r   ry   rz   rI  )
rV   rp   r   r$  r2   r:   r%  rF   rG   response)	r6   r!  rT   ry   r(   rz   rI  r~   rR   rM   r8   r9   rG     s8   

zHfFileSystemStreamFile.__init__rA  whencec                 C   s2   |dkr
|dkr
d S || j kr|dkrd S td)Nr   r   zCannot seek streaming HF file)rA  rV   )r6   rA  rM  r8   r8   r9   r    s
   zHfFileSystemStreamFile.seekr   rB  c                 C   sJ  |dkr|fnd}| j d u s| j j r<t| jj| jj| jj| jj| j	j
d}td|| j	j ddtjd| _ t| j  z	| j jj| }W nT ty   | j   t| jj| jj| jj| jj| j	j
d}td|dd	| j i| j	j ddtjd| _ t| j  z	| j jj| }W n ty   | j    w Y nw |  jt|7  _|S )
Nr   r8   r   r0  r1  T)r  r2  streamrO   Rangez	bytes=%d-)rL  rawisclosedr   r   r'   r(   r)   r&   r!  rD   r$   rI   r
  r   r3  r#   r   r  r  rA  r   )r6   rB  	read_argsr   r   r8   r8   r9   r   "  s`   




zHfFileSystemStreamFile.readr-   c                 C   rC  rq   rD  r   r8   r8   r9   r   S  rE  zHfFileSystemStreamFile.urlc                    r&  r'  r(  r   rM   r8   r9   r*  V  r+  zHfFileSystemStreamFile.__del__c                 C   s   t | j| j| j| j| jjffS rq   )reopenr!  rT   ry   	blocksizecacher   r   r8   r8   r9   
__reduce__\  s   z!HfFileSystemStreamFile.__reduce__)rx   Nr   rH  )r   rF  )r;   r<   r=   rA   r?   r   r  rG   r  r   r   r*  rV  r   r8   r8   rM   r9   r}     s.    1r}   r(   r-   c                 C   s   t | r| S t| S rq   )r`   rh   
safe_quoter   r8   r8   r9   r5   `  s   r5   sc                 C   s   t | ddS )Nr.   )safe)r   )rX  r8   r8   r9   rW  d  s   rW  rT   rj   c                 C   sN   | }t |tr|  d}nt |tr|  d}n
t |tr"|  d}t||)Nz (repository not found)z (revision not found)z (invalid repository id))rg   r   r   r"   r$  )rT   rj   msgr8   r8   r9   re   h  s   




re   r!  ry   rz   rI  c                 C   s   | j ||||dS )NrK  )r   )r!  rT   ry   rz   rI  r8   r8   r9   rS  s  s   rS  )	predicatezParameters
        ----------
zArgs:
zReturns
        -------
zReturn:
z
_Docstring taken from [fsspec documentation](https://filesystem-spec.readthedocs.io/en/latest/api.html#fsspec.spec.AbstractFileSystem.z)._z

)Pinspectr   rer8  collectionsr   dataclassesr   r   r   	itertoolsr   pathlibr   typingr   r	   r
   r   r   r   r   urllib.parser   r   fsspecfsspec.callbacksr   r   r   fsspec.utilsr   requestsr   r.   r   _commit_apir   r   errorsr   r   r   file_downloadr   r   hf_apir   r    r!   utilsr"   r#   r$   compileVERBOSEr`   r%   AbstractFileSystemrA   specAbstractBufferedFiler{   r}   r?   r5   rW  r  re   r  rS  
getmembers
isfunctionr   functiongetattrparentr>   
parent_docr   r8   r8   r8   r9   <module>   sl    $
    lTe