Se distribuye un generic function en función del tipo de todos sus argumentos. El programador define varias implementaciones de una función. El correcto se elige en el tiempo de llamada en función de los tipos de sus argumentos. Esto es útil para la adaptación de objetos, entre otras cosas. Python tiene algunas funciones genéricas que incluyen len()
.¿Cuál es la implementación de funciones genéricas mejor mantenida para Python?
Estos paquetes tienden a permitir que el código que se parece a esto:
@when(int)
def dumbexample(a):
return a * 2
@when(list)
def dumbexample(a):
return [("%s" % i) for i in a]
dumbexample(1) # calls first implementation
dumbexample([1,2,3]) # calls second implementation
Un ejemplo menos tonto que he estado pensando últimamente sería un componente web que requiere un usuario. En lugar de requerir un marco web en particular, el integrador sería sólo tiene que escribir algo como:
class WebComponentUserAdapter(object):
def __init__(self, guest):
self.guest = guest
def canDoSomething(self):
return guest.member_of("something_group")
@when(my.webframework.User)
componentNeedsAUser(user):
return WebComponentUserAdapter(user)
Python tiene algunas funciones implementaciones genéricas. ¿Por qué elegiría uno sobre los demás? ¿Cómo se usa esa implementación en las aplicaciones?
Estoy familiarizado con zope.component.queryAdapter(object, ISomething)
de Zope. El programador registra un adaptador invocable que toma una clase particular de objeto como argumento y devuelve algo compatible con la interfaz. Es una forma útil de permitir complementos. A diferencia del parche de mono, funciona incluso si un objeto necesita adaptarse a múltiples interfaces con los mismos nombres de método.
La función 'len' simplemente llama al método' __len__' de un objeto. ¿Es esto lo que quieres decir con función "genérica"? Si es así, hay relativamente pocas funciones que se comporten así. ¿Tienes algo más en mente? Si es así, elija un mejor ejemplo. –
¿Estás hablando de polimorfismo? ¿O estás hablando de parches de mono para agregar polimorfismos? –
parece que (basado en el enlace? Y el wikipedia proporcionado) joeforker está buscando implementar funciones sobrecargadas. Creo que se está refiriendo a "genérico" en el sentido de que la función se llama por 1 nombre pero ejecuta un código diferente en función de los parámetros pasados. Por lo tanto : mi_funcion (a) -> ejecutar funcion_a mi_funcion (b) -> ejecutar funcion_b Es una aplicación más elegante de analizar las ** kwargs para conseguir que codifican para ejecutar – Mark