¿Qué es un método generativo?

Estoy familiarizado con los generadores de Python, sin embargo, acabo de encontrar el término “método generativo” con el que no estoy familiarizado y no puedo encontrar una definición satisfactoria.

Para ponerlo en contexto, encontré el término en la documentación narrativa de SQLAlchemy:

El control total del comportamiento “autocommit” está disponible usando el método Generative Connection.execution_options () provisto en Connection, Engine, Executable, usando la bandera “autocommit” que activará o desactivará el autocommit para el scope seleccionado.

¿Qué es un método generativo? Intentar iterar el objeto devuelto por Connection.execution_options() no funciona, así que estoy pensando que es algo más que un generador estándar.

No parece ser un concepto de base de datos común, pero SQLAlchemy usa el término generativo en el sentido de “generado por su progtwig de forma iterativa en tiempo de ejecución”. (Por lo tanto, no hay conexión a los generadores de python). Un ejemplo del tutorial:

El objeto de Query es completamente generativo, lo que significa que la mayoría de las llamadas de método devuelven un nuevo objeto de Query en el que se pueden agregar criterios adicionales. Por ejemplo, para consultar los usuarios llamados “ed” con un nombre completo de “Ed Jones”, puede llamar a filter() dos veces, lo que une los criterios usando AND:

 >>> for user in session.query(User).\ ... filter(User.name=='ed').\ ... filter(User.fullname=='Ed Jones'): ... print user 

Esta syntax de llamada se conoce más comúnmente como “encadenamiento de métodos” y el diseño que lo permite como “interfaz fluida” .

Por lo tanto, en el caso de Connection.execution_options() , “generativo” significa que devuelve el objeto de conexión modificado, para que pueda encadenar las llamadas como se indicó anteriormente.

Mirando el código fuente de Connection.execution_options (lib / sqlalchemy / engine / base.py), todo lo que hace ese método es agregar opciones a la conexión.

La idea es que esas opciones influyan en el comportamiento futuro de, por ejemplo, consultas.

Como ejemplo:

  result = connection.execution_options(stream_results=True).\ execute(stmt) 

Aquí, el comportamiento se cambió en medio de la conexión solo para esta consulta. En cierto modo, se “genera” o se clona a sí mismo como un objeto que tiene un comportamiento ligeramente diferente.

Aquí también puede establecer autocommit en True. Ejemplo

 # obtain a connection connection = ... # do some stuff # for the next section we want autocommit on autocommitting_connection = connection.execution_options(autocommit=True) autocommitting_connection.execute(some_insert) result = autocommitting_connection.execute(some_query) # done with this section. Continue using connection (no autocommit) 

Esto es lo que se quiere decir con esa sección de la documentación. “método generativo” se refiere a un método que devuelve una copia modificada de la misma instancia con la que puede continuar trabajando. Esto es aplicable a las clases Conexión, Motor, Ejecutable.

Tendría que consultar la documentación específica o el código fuente de ese proyecto para estar realmente seguro, pero supongo que devuelve una versión modificada de algún objeto adaptado a los requisitos / comportamiento definidos por los argumentos.

La documentación establece:

El método devuelve una copia de esta Connection que hace referencia a la misma conexión DBAPI subyacente, pero también define las opciones de ejecución dadas que tendrán efecto para que una llamada se execute() .

Como @zzzeek comenta anteriormente, esto ahora está documentado en el glosario de SQLAlchemy.

medios generativos :

Un término que SQLAlchemy usa para referirse a lo que normalmente se conoce como encadenamiento de métodos; ver ese término para más detalles.

Y el método de encadenamiento es:

Una técnica orientada a objetos mediante la cual el estado de un objeto se construye llamando a los métodos en el objeto. El objeto presenta cualquier número de métodos, cada uno de los cuales devuelve un nuevo objeto (o en algunos casos el mismo objeto) con un estado adicional agregado al objeto.