2009-04-09 29 views
58

Como esto dice:sobrecarga de funciones en Python: Falta

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

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.

+3

Entonces? ¿Para qué crees que necesitas una sobrecarga? – kquinn

+2

Votar para cerrar no es una pregunta real. Eso no quiere decir que no sea un punto potencialmente válido, pero no es una pregunta. –

+0

Bueno, entonces use un lenguaje que proporcione sobrecarga ... –

Respuesta

31

como relajarse señalado, los argumentos de palabras clave con valores por defecto puede 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, es posible 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 se podría hacer cualquiera de estas:

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

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

+36

Luego, un ejemplo sin problema de diseño, por favor. – accuya

+1

De acuerdo, es un poco artificial, pero esto resume una lista de int/str y considera '[a-z]/i' tener los valores 1-26: https://gist.github.com/cmattoon/abeed5fb8367b0b869cf –

6

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

22

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, asuma que es un número entero y siga 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.

+6

La sobrecarga no se trata estrictamente de tipos, sino también de la cantidad de argumentos. Por ejemplo, es posible que desee que mi acceso y mutador (o "getter" y "setter" si lo prefiera) compartan un solo nombre de método, pero claramente están haciendo cosas separadas en función de la presencia de un argumento. Esto no tiene nada que ver con el tipo de argumento. – Nerdmaster

6

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 llame a las funciones de acuerdo con los datos recibidos.

se tomó un tiempo para mí para ajustarse a éste que viene de Java, pero realmente tampoco un "gran hándicap"

37

Ahora, a menos que estés tratando de escribir código en C++ utilizando la sintaxis de Python, lo que haría que ¿Necesita sobrecargar?

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.

Véase, por ejemplo: What is a clean, pythonic way to have multiple constructors in Python?

+54

Su evaluación de que la sobrecarga es _ "hack-work para idiomas con discapacidad" _ parece demasiado polarizada y pasa por alto el beneficio del tipado estático y su idoneidad para un tipo diferente de implementación. [Respuesta de Stefano Borini] (http://stackoverflow.com/a/733385/322333) that _ "... la sobrecarga de funciones se basa en la idea de que al pasar diferentes tipos ejecutará un código diferente. Si tiene un lenguaje escrito dinámicamente como Python, no debe distinguir por tipo "_ es más informativo y útil, creo. – boycy

+8

Por supuesto, también puede usar argumentos variables en C++, aunque la sobrecarga se usa para mantener el código * clean *. Como en, una función hace una cosa en lugar de tener una sola función llena de declaraciones si intentan averiguar qué hacer en función de lo que se pasó. – Nerdmaster

Cuestiones relacionadas