o
    i                     @   sN   d dl mZmZmZ d dlmZmZ d dlmZ d dl	m
Z
 G dd dZdS )    )MappingOptionalTuple)check_argument_typescheck_return_type)NestedDictAction)str_or_nonec                   @   sz   e Zd ZdZ			ddedeeef dededef
d	d
Zde	e
e df fddZde
e de
e fddZdd ZdS )ClassChoicesaq  Helper class to manage the options for variable objects and its configuration.

    Example:

    >>> class A:
    ...     def __init__(self, foo=3):  pass
    >>> class B:
    ...     def __init__(self, bar="aaaa"):  pass
    >>> choices = ClassChoices("var", dict(a=A, b=B), default="a")
    >>> import argparse
    >>> parser = argparse.ArgumentParser()
    >>> choices.add_arguments(parser)
    >>> args = parser.parse_args(["--var", "a", "--var_conf", "foo=4")
    >>> args.var
    a
    >>> args.var_conf
    {"foo": 4}
    >>> class_obj = choices.get_class(args.var)
    >>> a_object = class_obj(**args.var_conf)

    NFnameclasses
type_checkdefaultoptionalc                 C   s   t  sJ || _|| _dd | D | _d| jv s$d| jv s$d| jv r(td|d urD| j D ]}t||sCtd|j d| q1|| _	|| _
|d u rSd	| _	d S d S )
Nc                 S   s   i | ]	\}}|  |qS  )lower).0kvr   r   O/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/train/class_choices.py
<dictcomp>+   s    z)ClassChoices.__init__.<locals>.<dictcomp>nonenilnullz'"none", "nil", and "null" are reserved.zmust be z
, but got T)r   r
   	base_typeitemsr   
ValueErrorvalues
issubclass__name__r   r   )selfr
   r   r   r   r   r   r   r   r   __init__    s    


zClassChoices.__init__return.c                 C   s   t | j}| jr|d S |S )NN)tupler   r   )r   retvalr   r   r   choices8   s   
zClassChoices.choicesc              
   C   s   t  sJ |d u s| jr| dkrd }|S | | jv r,| j| }t|s(J |}|S td| j d|   d| j d|  )N)r   r   r   --z must be one of z: -- )r   r   r   r   r   r   r
   r%   )r   r
   r$   	class_objr   r   r   	get_class?   s    

zClassChoices.get_classc                 C   sZ   |j d| j dd | j|  d| j dd |j d| j dtt d| j d	 d S )
Nr&   c                 S   s   t |  S r"   )r   r   )xr   r   r   <lambda>R   s    z,ClassChoices.add_arguments.<locals>.<lambda>zThe z type)typer   r%   help_confzThe keyword arguments for )actionr   r-   )add_argumentr
   r   r%   r   dict)r   parserr   r   r   add_argumentsO   s   


zClassChoices.add_arguments)NNF)r   
__module____qualname____doc__strr   r,   boolr    r   r   r%   r)   r3   r   r   r   r   r	   	   s&    

r	   N)typingr   r   r   	typeguardr   r    espnet2.utils.nested_dict_actionr   espnet2.utils.typesr   r	   r   r   r   r   <module>   s
    