es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Argumentos mutuamente excluyentes en Python

¿Cuál es la mejor manera de definir una función que depende de argumentos excluyentes entre sí, es decir, un conjunto de argumentos en los que solo necesito especificar uno a la vez? Un ejemplo sencillo sería una función que tome un parámetro físico como entrada, por ejemplo, la frecuencia. Ahora quiero que el usuario pueda especificar directamente la frecuencia o en su lugar la longitud de onda, de modo que puedan llamar igualmente a la función de la siguiente manera:

func(freq=10)
func(wavelen=1).

Una opción serían los kwargs, pero ¿hay una mejor manera (en cuanto a las docstrings, por ejemplo)?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de definir una función que depende de argumentos mutuamente excluyentes es usar **kwargs, donde la función tiene un conjunto de argumentos predeterminados y también acepta cualquier argumento nombrado que se le pase.

    Por ejemplo:

    def func(**kwargs):
        if 'freq' in kwargs:
            # calcular algo usando la frecuencia
            pass
        elif 'wavelen' in kwargs:
            # calcular algo usando la longitud de onda
            pass
        else:
            raise ValueError('Se debe especificar freq o wavelen.')
    

    La desventaja de usar **kwargs es que puede no ser claro para el usuario qué argumentos están permitidos o son obligatorios, y también la firma de la función puede no ser clara en la cadena de documentación.

    Un enfoque alternativo es usar un solo argumento requerido y establecer los otros argumentos como opcionales con valores predeterminados. Esto se puede explicar claramente en la cadena de documentación.

    Por ejemplo:

    def func(param, freq=None, wavelen=None):
        """
        Calcula algo basado en un parámetro físico.
    
        Parámetros:
        param (float): El parámetro físico (por ejemplo, frecuencia o longitud de onda).
        freq (float, opcional): La frecuencia.
        wavelen (float, opcional): La longitud de onda.
        Solo se debe especificar freq o wavelen.
    
        Retorna:
        float: El resultado del cálculo.
        """
        if freq is not None and wavelen is not None:
            raise ValueError('Solo se debe especificar freq o wavelen.')
        elif freq is not None:
            # calcular algo usando la frecuencia
            pass
        elif wavelen is not None:
            # calcular algo usando la longitud de onda
            pass
        else:
            raise ValueError('Se debe especificar freq o wavelen.')
    

    En este caso, se requiere que el usuario especifique el parámetro físico y también puede especificar opcionalmente la frecuencia o la longitud de onda. La cadena de documentación deja claro que solo se debe especificar una de las opciones freq o wavelen.

Comments are closed.