Funciones sobrecargadas en Python?
function arguments (5)
¿Es posible tener funciones sobrecargadas en Python? En C # haría algo así como
void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}
y luego cuando llamo a la función, se diferenciaría entre los dos según el número de argumentos. ¿Es posible hacer algo similar en Python?
No es posible directamente. Sin embargo, puede usar comprobaciones explícitas de tipo sobre los argumentos propuestos, aunque esto generalmente no está bien visto.
Python es dinámico. Si no está seguro de lo que puede hacer un objeto, simplemente intente: y llame a un método, a excepción de: errores.
Si no necesita sobrecargar en función de los tipos, sino solo del número de argumentos, use argumentos de palabra clave.
Si 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 de overload
elige una función para llamar dependiendo del número de argumentos sin nombre .
La solución no es perfecta, pero por el momento no puedo escribir nada mejor.
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 quiere hacer esto, puede hacer que funcione (a riesgo de ofender a los tradicionalistas; o). en resumen, escribiría una función de wrapper(*args)
que verifica el número de argumentos y delegados según corresponda. este tipo de "pirateo" generalmente se realiza a través de decoradores. en este caso podrías lograr algo como:
from typing import overload
@overload
def myfunction(first):
....
@myfunction.overload
def myfunction(first, second):
....
@myfunction.overload
def myfunction(first, second, third):
....
e implementaría esto haciendo que la función de overload(first_fn)
(o constructor) devuelva un objeto invocable donde el __call__(*args)
explica la delegación anterior y el método de overload(another_fn)
agrega funciones adicionales que se pueden delegar a .
Puede ver un ejemplo de algo similar aquí http://acooke.org/pytyp/pytyp.spec.dispatch.html pero eso está sobrecargando los métodos por tipo. es un enfoque muy similar ...
ACTUALIZACIÓN: y algo similar (usando tipos de argumentos) se está agregando a python 3 - http://www.python.org/dev/peps/pep-0443/
métodos de sobrecarga es complicado en Python. Sin embargo, podría haber un 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 las personas sobrecargar los métodos.
Tomemos el ejemplo de uso en uno de los hilos de :
un método de sobrecarga de clase con llamar a los métodos de diferentes clases.
def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):
pasar 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á manejando la lista, el diccionario o las variables primitivas de la sobrecarga de métodos.
pruébalo para tus códigos
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 se tipea dinámicamente y admite argumentos opcionales para las 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