Soy un usuario frecuente de las barras invertidas de forma similar a lo que indicó zzzeek en su respuesta. PEP8 es solo una guía, ¡no pierdas el sueño cuando la violas!
Sin embargo, también utilizo con frecuencia el tipo de formato de abajo, donde he robado primer ejemplo de zzzeek, ligeramente retocado, y reordenada:
q = Session.query(
Subkeyword.subkeyword_id,
Subkeyword.subkeyword_word,
)
q = q.filter_by(subkeyword_company_id=self.e_company_id) # first filter
q = q.filter_by(subkeyword_word=subkeyword_word) # 2nd filter
q = q.filter_by(subkeyword_active=True)
if filter_by_foo:
q = q.filter(Subkeyword.foo == True)
# Run the query (I usually wrap in a try block)...
subkeyword = q.one()
La reasignación repetida a q parece un poco desagradable al principio , pero lo he superado. El impacto en el rendimiento es efectivamente nulo. Una gran ventaja de esta forma es que puede mezclar los comentarios finales y las líneas de comentarios para documentar sus consultas (como ya he hecho con las adiciones inútiles que aparecen arriba). Encadenar líneas con barras invertidas te limita aquí.
Esta forma de formato es particularmente limpia cuando la formulación de consultas masivas con toneladas de modificaciones de lógica-triggered, selecciona escalares integrados, etc.
Como otro ejemplo, tengo una bastante grandes (> 150 líneas) CTE consulta I Estoy generando en SQLAlchemy que tiene una gran cantidad de lógica mixta, alias y etiquetado (que es esencial para la legibilidad de la consulta generada) que mezcla ambos métodos.Una versión seriamente reducida (y mutilado) de que comience algo, como a continuación:
cte_init = session.\
query(
child1.foo.label("child1_foo"),
sa.literal(1).label("indent"), # can comment on non-slashed lines
child2.bar.label("child2bar"),
#comments between non-slashed lines ok, too
sa.func.MAX(toplevel.baz).label("max_baz"),
).\
select_from(top_level).\
join(child1,
child1.id == toplevel.fk_child1_id).\
join(child2.
child2.id == toplevel.fk_child2.id).\
filter(top_level.name == "bogus").\
cte(name = "cte", recursive = True)
if(use_filter_x):
cte_init = cte_init.filter_by(x = "whatever")
# etc (no, the above doesn't make any sense)...
En general, si se asegura de llevar sus líneas con las nuevas operaciones (como muchos esquemas de formato SQL común no), se mantiene bastante legible Tampoco le tengas miedo a las nuevas líneas entre corchetes.
uso de barras diagonales buenas en la guía de estilo de equipo de pocoo http://www.pocoo.org/internal/styleguide/ – estin