Я частый пользователь обратной косой черты, аналогично тому, что указал zzzeek в своем ответе. PEP8 - это просто руководство, не теряйте сон, если нарушаете его!
Однако я также часто использую приведенный ниже тип форматирования, где я украл первый пример zzzeek, слегка подправил его и переформатировал:
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()
Повторное переназначение q сначала кажется довольно неприятным, но я с этим справился. Влияние на производительность практически равно нулю. Большим преимуществом этого способа является то, что вы можете смешивать как завершающие комментарии, так и строки комментариев для документирования ваших запросов (как я сделал с бесполезными дополнениями выше). Цепочка с обратными слешами ограничивает вас здесь.
Этот способ форматирования особенно удобен при формулировании массивных запросов с тоннами модификаций, вызванных логикой, встроенными скалярными выборками и т. Д.
В качестве другого примера, у меня есть довольно большой (> 150 строк) запрос CTE, который я генерирую в SQLAlchemy, который имеет много смешанной логики, псевдонимов и меток (что важно для читаемости сгенерированного запроса), который смешивается оба метода. Его серьезно уменьшенная (и искаженная) версия начинается примерно так:
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)...
В общем, если вы уверены, что начинаете свои строки с новых операций (как это делают многие распространенные схемы форматирования SQL), он остается вполне читабельным. Также не бойтесь перевода строки в скобках.