type from define argument python overloading missing-features

from - python api



Sobrecarga de funciones en Python: falta (5)

A menudo ve la sugerencia de usar los argumentos de palabra clave, con valores predeterminados, en su lugar. Mira eso.

Como esto dice:

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

La sobrecarga de funciones está ausente en Python.

En lo que a mí respecta, esta es una gran desventaja ya que también es un lenguaje OO. Inicialmente, me di cuenta de que no era posible diferenciar entre los tipos de argumento, pero la naturaleza dinámica de Python lo hacía fácil (por ejemplo, list, tuples, strings son muy similares).

Sin embargo, contar el número de argumentos pasados ​​y luego hacer el trabajo es como una exageración.


Ahora, a menos que intente escribir código C ++ utilizando la sintaxis de Python, ¿para qué necesitaría una sobrecarga?

Creo que es exactamente lo contrario, la sobrecarga solo es necesaria para hacer que los lenguajes fuertemente tipados actúen más como Python. En Python tienes un argumento de palabra clave, tienes *args y **kwargs .

Ver por ejemplo: ¿Cuál es una manera limpia y pitonica de tener múltiples constructores en Python?


Como se mencionó, los argumentos de palabra clave con valores predeterminados pueden recorrer un largo camino.

También declararé que, en mi opinión, va en contra del espíritu de Python preocuparse mucho sobre qué tipos se pasan a los métodos. En Python, creo que es más aceptado usar la tipificación de pato, preguntando qué puede hacer un objeto, en lugar de qué es.

Por lo tanto, si su método puede aceptar una cadena o una tupla, puede hacer algo como esto:

def print_names(names): """Takes a space-delimited string or an iterable""" try: for name in names.split(): # string case print name except AttributeError: for name in names: print name

Entonces podrías hacer cualquiera de estos:

print_names("Ryan Billy") print_names(("Ryan", "Billy"))

Aunque una API como esa a veces indica un problema de diseño.


Puede pasar un tipo de datos de contenedor mutable a una función, puede contener todo lo que desee.

Si necesita una funcionalidad diferente, nombre las funciones de manera diferente, o si U necesita una misma interfaz, simplemente escriba una función de interfaz (o método) que invoque las funciones de manera apropiada en función de los datos recibidos.

Me tomó un tiempo ajustarme a esto desde Java, pero realmente no es un "gran handicap"


no necesita sobrecargar la función, ya que tiene los argumentos * args y ** kwargs.

El hecho es que la sobrecarga de funciones se basa en la idea de que pasar diferentes tipos ejecutará código diferente. Si tiene un lenguaje de tipado dinámico como python, no debe distinguir por tipo, pero debe tratar con las interfaces y su conformidad con el código que escribe.

Por ejemplo, si tiene un código que puede manejar un número entero o una lista de números enteros, puede intentar iterar en él y, si no puede, asume que es un número entero y sigue adelante. Por supuesto, podría ser un flotante, pero en lo que respecta al comportamiento, si un flotante y un int parecen ser iguales, entonces pueden intercambiarse.