¿Funciones sobrecargadas en python?


¿Es posible tener funciones sobrecargadas en Python? En C # haría algo como

void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}

Y entonces cuando llamo a la función diferenciaría entre los dos basados en el número de argumentos. Es posible hacer algo similar en Python?

Author: Trcx, 2011-08-18

5 answers

EDITAR Para las nuevas funciones genéricas de despacho único en Python 3.4, consulte http://www.python.org/dev/peps/pep-0443 /

Generalmente no necesita sobrecargar funciones en Python. Python es dinámicamente escrito, y soporta argumentos opcionales para funciones.

def myfunction(first, second, third = None):
    if third is None:
        #just use first and second
    else:
        #use all three

myfunction(1, 2) # third will be None, so enter the 'if' clause
myfunction(3, 4, 5) # third isn't None, it's 5, so enter the 'else' clause
 89
Author: agf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 20:19:20

En python normal no puedes hacer lo que quieres. hay dos aproximaciones cercanas:

def myfunction(first, second, *args):
    # args is a tuple of extra arguments

def myfunction(first, second, third=None):
    # third is optional

Sin embargo, si realmente quieres hacer esto, ciertamente puedes hacer que funcione (a riesgo de ofender a los tradicionalistas ;o). en resumen, escribiría una función wrapper(*args) que comprueba el número de argumentos y delegados según corresponda. este tipo de" hackeo " generalmente se realiza a través de decoradores. en este caso se podría lograr algo como:

from typing import overload

@overload
def myfunction(first):
    ....

@myfunction.overload
def myfunction(first, second):
    ....

@myfunction.overload
def myfunction(first, second, third):
    ....

Y usted implementaría esto por haciendo el overload(first_fn) function (o constructor) devuelve un objeto __call__(*args) método ¿La delegación explicada anteriormente y el overload(another_fn) method añade funciones adicionales a las que se pueden delegar.

Puedes ver un ejemplo de algo similar aquí http://acooke.org/pytyp/pytyp.spec.dispatch.html pero eso es sobrecargar métodos por tipo. es un enfoque muy similar...

ACTUALIZACIÓN: y algo similar (usando tipos de argumento) está siendo añadido a python 3 - http://www.python.org/dev/peps/pep-0443/

 39
Author: andrew cooke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-03 16:19:14

Sí, es posible. Escribí el código a continuación en Python 3.2.1:

def overload(*functions):
    return lambda *args, **kwargs: functions[len(args)](*args, **kwargs)

Uso:

myfunction=overload(no_arg_func, one_arg_func, two_arg_func)

Tenga en cuenta que la lambda devuelta por las funciones overloadelige la función a llamar dependiendo del número de argumentos sin nombre.

La solución no es perfecta, pero por el momento no puedo escribir nada mejor.

 6
Author: GingerPlusPlus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-24 19:44:13

No es posible directamente. Sin embargo, puede usar comprobaciones de tipo explícitas en los argumentos dados, aunque esto generalmente está mal visto.

Python es dinámico. Si no está seguro de lo que puede hacer un objeto, simplemente intente: y llame a un método en él, luego except: errors.

Si usted no necesita sobrecargar basado en tipos sino solo en el número de argumentos, utilice argumentos de palabras clave.

 1
Author: Jürgen Strobel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-18 19:33:23

Sobrecargar los métodos es complicado en python. Sin embargo, podría haber uso de pasar el dict, la lista o las variables primitivas.

He intentado algo para mis casos de uso, esto podría ayudar aquí a entender a la gente a sobrecargar los métodos.

Tomemos el ejemplo de uso en uno de los subprocesos de stackoverflow:

Un método de sobrecarga de clase con llamar a los métodos desde una clase diferente.

def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):

Pase los argumentos de la clase remota:

add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}

O add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}

Por lo tanto, se está logrando el manejo de variables de lista, Diccionario o primitivas a partir de la sobrecarga de métodos.

Pruébelo para sus códigos

 0
Author: shashankS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-30 06:44:51