o
    H!io                     @   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 dgZG dd de	Z
dd	 Zd
d ZdddZdd Zdd ZdddZdddZdd ZdS )    N   )logging)custom_open
get_configc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	AttrDictz	Attr Dictc                 C   s   || v r| | S t |N)AttributeError)selfkey r   `/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddlex/utils/config.py__getattr__   s   zAttrDict.__getattr__c                 C   s$   || j v r|| j |< d S || |< d S r   )__dict__)r	   r
   valuer   r   r   __setattr__$   s   
zAttrDict.__setattr__c                 C   s   t t| S r   )copydeepcopydict)r	   contentr   r   r   __deepcopy__*   s   zAttrDict.__deepcopy__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s
    r   c              	   C   s   ddl m} |  D ]7\}}t|tu rt| | |< }t|tr1z||}W n	 ty0   Y nw t|tr=t	| |  q
|| |< q
dS )zcreate attr dictr   )literal_evalN)
astr   itemstyper   r   
isinstancestrBaseExceptioncreate_attr_dict)yaml_configr   r
   r   r   r   r   r!   .   s   


r!   c                 C   sJ   t | d}ttj|tjd}W d   n1 sw   Y  t| |S )z Load a config file into AttrDictr)LoaderN)r   r   yamlloadZ
SafeLoaderr!   )Zcfg_fileZfopenr"   r   r   r   parse_config@   s
   r'   c                 C   s   d}t |  D ][\}}t|tr$td|d | t||d  n6t|trNt	|dkrNt|d trNtd|d | |D ]	}t||d  qCntd|d || |
 rct| qdS )	z_
    Recursively visualize a dict and
    indenting according by the relationship of keys.
    z<------------------------------------------------------------z{}{} :     r   r   z	{}{} : {}N)sortedr   r   r   r   infoformat
print_dictlistlenisupper)d	delimiterplaceholderkvr   r   r   r   r-   H   s   
$
r-   c                 C   s   t   t|  dS )zB
    visualize configs
    Arguments:
        config: configs
    N)r   Z	advertiser-   )configr   r   r   print_config\   s   r7   c                    s4   fdd}t | ttfsJ dt|dksJ dt | trP||d }t|dkrB|t| k s:J d|| | | |< dS t| | |dd   dS t|dkrq|d | vrgtd	|d  d
 | | |d < dS |d |  vri | |d < td|d  d
 t| |d  |dd   dS )z
    Recursively replace dict of list
    Args:
        dl(dict or list): dict or list to be replaced
        ks(list): list of keys
        v(str): value to be replaced
    c                    sF   | dv rdS | dv rdS | dv rdS zt  W S  ty"   |  Y S w )zconvert str type value
        to None type if it is "None",
        to bool type if it means True or False,
        to int type if it can be eval().
        NoneN)TRUETruetrueTtT)FALSEFalsefalseFfF)eval	Exception)sr5   r   r   	parse_stro   s   
zoverride.<locals>.parse_strz{} should be a list or a dictr   z#length of keys should larger than 0r   zindex({}) out of range({})NzA new field (z) detected!zA new Series field ()	r   r.   r   r/   r,   overrider   warningkeys)dlksr5   rG   r4   r   rF   r   rH   f   s"   	
 rH   c                 C   s   |dur>|D ]7}t |tsJ d|d|v sJ d||d}t|dks.J d|\}}|d}t| || q| S )aP  
    Recursively override the config
    Args:
        config(dict): dict to be replaced
        options(list): list of pairs(key0.key1.idx.key2=value)
            such as: [
                'topk=2',
                'VALID.transforms.1.ResizeImage.resize_short=300'
            ]
    Returns:
        config(dict): replaced config
    Nzoption({}) should be a str=zAoption({}) should contain a =to distinguish between key and value   z#there can be only a = in the option.)r   r   r,   splitr/   rH   )r6   optionsoptpairr
   r   rJ   r   r   r   override_config   s   


rT   Fc                 C   s<   t j| sJ d| t| }t|| |rt| |S )z
    Read config from file
    zconfig file({}) is not exist)ospathexistsr,   r'   rT   r7   )fnameZ	overridesshowr6   r   r   r   r      s   
c                  C   sR   t d} | jddtddd | jddd	g d
d | jddtddd |  }|S )z
parse argszPaddleX scriptz-cz--configzconfigs/config.yamlzconfig file path)r   defaulthelpz-oz
--overrideappendzconfig options to be overridden)actionrZ   r[   z-pz--profiler_optionsNzXThe option of profiler, which should be in format "key1=value1;key2=value2;key3=value3".)argparseArgumentParseradd_argumentr   
parse_args)parserargsr   r   r   ra      s0   
ra   )r   r   )NF)r^   r   rU   r%    r   Zfile_interfacer   __all__r   r   r!   r'   r-   r7   rH   rT   r   ra   r   r   r   r   <module>   s    


0
