¿Existen formas de mantener el estado (para fines de optimización, por ejemplo) sin ir completamente orientadas a objetos?¿Cómo mantener el estado en Python sin clases?
para ilustrar mi mejor pregunta, he aquí un ejemplo de un patrón de uso frecuente en JavaScript:
var someFunc = (function() {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
Externamente esto es sólo una función como cualquier otro, sin necesidad de inicializar objetos ni nada de eso, pero el cierre permite calcular valores una sola vez que luego esencialmente uso como constantes.
Un ejemplo de esto en Python es la hora de optimizar las expresiones regulares - es útil el uso de re.compile
y se almacena la versión compilada para match
y search
operaciones.
La única manera que conozco para hacer esto en Python están estableciendo una variable en el ámbito de módulo:
compiled_regex = compile_my_regex()
def try_match(m): # In reality I wouldn't wrap it as pointlessly as this
return compiled_regex.match(m)
O mediante la creación de una clase:
class MatcherContainer(object):
def __init__(self):
self.compiled_regex = compile_my_regex()
def try_match(self, m):
self.compiled_regex.match(m)
my_matcher = MatcherContainer()
El primer enfoque es el anuncio -hoc y no está muy claro que la función y la variable declarada arriba estén asociadas entre sí. También se sienta contamina el espacio de nombres del módulo un poco, que no estoy muy contento con.
El último enfoque parece prolijo y un poco pesado en la repetición.
La única otra forma en que puedo pensar para manejar esto es factorizar cualquier función como esta en archivos separados (módulos) e importar las funciones, para que todo esté limpio.
¿Algún consejo de Pythoners más experimentados sobre cómo lidiar con esto? ¿O simplemente no te preocupas y continúas resolviendo el problema?
Personalmente no veo ningún problema con la creación de su clase. La verbosidad es buena. "' Explícito es mejor que implícito. " – tMC
Una forma de hacer que al menos el uso de esa clase sea menos detallado sería renombrar' try_match' a '__call__', que le permite usarlo (después de la construcción) exactamente como una función. Pero, como en la respuesta de @ glglgl, su código de JavaScript realmente se traduce directamente en Python. – lvc
es esa llamada a alguna falla correcta en su primer ejemplo? ¿O debería ser la definición de la función? – soulcheck