У меня есть очень длинный запрос. Я хотел бы разбить его на несколько строк в Python. Способ сделать это в JavaScript - использовать несколько предложений и соединить их оператором +
(я знаю, возможно, это не самый эффективный способ, но на данном этапе меня не очень волнует производительность, только читабельность кода). Пример:
var long_string = 'some text not important. just garbage to' +
'illustrate my example';
Я пытался сделать что-то подобное в Python, но это не сработало, поэтому я использовал \
для разделения длинной строки. Однако я не уверен, что это единственный/лучший/питонический способ сделать это. Это выглядит неуклюже.
Фактический код:
query = 'SELECT action.descr as "action", '\
'role.id as role_id,'\
'role.descr as role'\
'FROM '\
'public.role_action_def,'\
'public.role,'\
'public.record_def, '\
'public.action'\
'WHERE role.id = role_action_def.role_id AND'\
'record_def.id = role_action_def.def_id AND'\
'action.id = role_action_def.action_id AND'\
'role_action_def.account_id = ' + account_id + ' AND'\
'record_def.account_id=' + account_id + ' AND'\
'def_id=' + def_id
Вы говорите о многострочных строках? Легко, используйте тройные кавычки для их начала и конца.
s = """ this is a very
long string if I had the
energy to type more and more ..."""
Вы можете использовать и одинарные кавычки (конечно, 3 из них в начале и конце) и обращаться с полученной строкой s
так же, как с любой другой строкой.
ПРИМЕЧАНИЕ: Как и в любой другой строке, все, что находится между начальной и конечной кавычками, становится частью строки, поэтому в данном примере есть ведущий пробел (как указал @root45). Эта строка также будет содержать пробелы и новые строки.
То есть:
' this is a very\n long string if I had the\n energy to type more and more ...'
Наконец, в Python можно также строить длинные строки следующим образом:
s = ("this is a very"
"long string too"
"for sure ..."
)
которая не будет включать лишние пробелы или новые строки (это намеренный пример, показывающий, к какому эффекту приведет пропуск пробелов):
'this is a verylong string toofor sure ...'
Запятые не нужны, просто поместите строки, которые нужно соединить, в пару скобок и не забудьте учесть все необходимые пробелы и новые строки.
Если вам не нужна многострочная строка, а просто длинная однострочная строка, вы можете использовать круглые скобки, только убедитесь, что между сегментами строки нет запятых, тогда это будет кортеж.
query = ('SELECT action.descr as "action", '
'role.id as role_id,'
'role.descr as role'
' FROM '
'public.role_action_def,'
'public.role,'
'public.record_def, '
'public.action'
' WHERE role.id = role_action_def.role_id AND'
' record_def.id = role_action_def.def_id AND'
' action.id = role_action_def.action_id AND'
' role_action_def.account_id = '+account_id+' AND'
' record_def.account_id='+account_id+' AND'
' def_id='+def_id)
В SQL-запросе, подобном тому, который вы создаете, многострочные строки также будут в порядке. Но если лишние пробельные символы, которые содержит многострочная строка, являются проблемой, то это хороший способ достичь желаемого.
Ломающ линии на работ \ ` для меня. Вот пример:
longStr = "This is a very long string " \
"that I wrote to help somebody " \
"who had a question about " \
"writing long strings in Python"
Я нашел себя счастливой с этим:
string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')
Я считаю, что при построении длинных строк, вы обычно делаете что-то вроде построения SQL-запрос, в этом случае лучше:
query = ' '.join(( # note double parens, join() takes an iterable
"SELECT foo",
"FROM bar",
"WHERE baz",
))
Что Левон предложил-это хорошо, но может быть уязвим к ошибкам:
query = (
"SELECT foo"
"FROM bar"
"WHERE baz"
)
query == "SELECT fooFROM barWHERE baz" # probably not what you want
Вы можете также объединить переменные при использовании " и" не то" обозначения:
foo = '1234'
long_string = """fosdl a sdlfklaskdf as
as df ajsdfj asdfa sld
a sdf alsdfl alsdfl """ + foo + """ aks
asdkfkasdk fak"""
Редактировать: нашел лучший способ, с именем params и .формат():
body = """
<html>
<head>
</head>
<body>
<p>Lorem ipsum.</p>
<dl>
<dt>Asdf:</dt> <dd><a href="{link}">{name}</a></dd>
</dl>
</body>
</html>
""".format(
link='http://www.asdf.com',
name='Asdf',
)
print(body)
В Python >= 3.6 можно использовать отформатирован строковые литералы (строки Ф)
query= f'''SELECT action.descr as "action"
role.id as role_id,
role.descr as role
FROM
public.role_action_def,
public.role,
public.record_def,
public.action
WHERE role.id = role_action_def.role_id AND
record_def.id = role_action_def.def_id AND
action.id = role_action_def.action_id AND
role_action_def.account_id = {account_id} AND
record_def.account_id = {account_id} AND
def_id = {def_id}'''
Этот подход использует:
проверить
модульи
def_id` переменных. Этот способ выглядит наиболее подходящие для Python для меня.
# import textwrap # See update to answer below
import inspect
# query = textwrap.dedent(f'''\
query = inspect.cleandoc(f'''
SELECT action.descr as "action",
role.id as role_id,
role.descr as role
FROM
public.role_action_def,
public.role,
public.record_def,
public.action
WHERE role.id = role_action_def.role_id AND
record_def.id = role_action_def.def_id AND
action.id = role_action_def.action_id AND
role_action_def.account_id = {account_id} AND
record_def.account_id={account_id} AND
def_id={def_id}'''
)
Обновление: 1/29/2019 включить @ShadowRanger'ы предложение использовать проверить.cleandoc
вместо textwrap.dedent
Например:
sql = ("select field1, field2, field3, field4 "
"from table "
"where condition1={} "
"and condition2={}").format(1, 2)
Output: 'select field1, field2, field3, field4 from table
where condition1=1 and condition2=2'
если значение условия должно быть строкой, вы можете сделать как этот:
sql = ("select field1, field2, field3, field4 "
"from table "
"where condition1='{0}' "
"and condition2='{1}'").format('2016-10-12', '2017-10-12')
Output: "select field1, field2, field3, field4 from table where
condition1='2016-10-12' and condition2='2017-10-12'"
Я лично считаю следующее, чтобы быть лучшим (простые, безопасные и подходящие для Python) способ писать сырые SQL-запросы в Python, особенно при использовании Пайтон'ы и sqlite3 Модуль:
query = '''
SELECT
action.descr as action,
role.id as role_id,
role.descr as role
FROM
public.role_action_def,
public.role,
public.record_def,
public.action
WHERE
role.id = role_action_def.role_id
AND record_def.id = role_action_def.def_id
AND action.id = role_action_def.action_id
AND role_action_def.account_id = ?
AND record_def.account_id = ?
AND def_id = ?
'''
vars = (account_id, account_id, def_id) # a tuple of query variables
cursor.execute(query, vars) # using Python's sqlite3 module
Плюсы ###
?
заполнитель, это может стать немного трудно отслеживать, какие ?
должен быть заменен, какую переменную в Python, когда есть много из них в запросе.Другие уже упомянули метод скобках, но я'd, как, чтобы добавить, что со скобками, встроенные комментарии разрешены.
питон nursery_rhyme = ( 'У Мэри был маленький ягненок,' # комментарии отличные! 'его шерсть была белой как снег.' 'и везде, что Мария пошла,' 'ее овцы, несомненно, идут.' # какая надоедливых овец. )
При использовании обратной косой черты продолжений строк (\
), комментарии не допускаются. Вы'будете получать синтаксис ошибка: неожиданный символ после ошибки продолжение строки символ`.
`` nursery_rhyme = 'У Мэри был маленький ягненок,' \ # эти комментарии 'его шерсть была белой как снег.' \ # являются недействительными! 'и везде, что Мария пошла,' \ 'ее овцы, несомненно, идут.'
``
На примере из https://docs.python.org/3/library/re.html#re.VERBOSE,
а = ре.компиляции( Р'\д+' # неотъемлемой частью Р'\.' # десятичной точки Р'\д*' # некоторые дробные цифры )
``
а = ре.компиляции(Р" и" и" В\Д + # неотъемлемой частью . # десятичной точки \д * # какие-то дробные цифры" и" и" и, вновь.Х) ``
Я обычно использую что-то вроде этого:
text = '''
This string was typed to be a demo
on how could we write a multi-line
text in Python.
'''
Если вы хотите удалить досадные пробелы в каждой строке, вы можете сделать следующим образом:
text = '\n'.join(line.lstrip() for line in text.splitlines())
Ваш фактический код не должен работать, вам не хватает пробелов в конце "строк" (например: role.descr as roleFROM...
).
Для многострочной строки существуют тройные кавычки:
string = """line
line2
line3"""
Она будет содержать переносы строк и лишние пробелы, но для SQL это не проблема.
и" À ла" и скала (но я думаю, что является наиболее подходящие для Python способ, как ОК требования):
description = """
| The intention of this module is to provide a method to
| pass meta information in markdown_ header files for
| using it in jinja_ templates.
|
| Also, to provide a method to use markdown files as jinja
| templates. Maybe you prefer to see the code than
| to install it.""".replace('\n | \n','\n').replace(' | ',' ')
Если вы хотите окончательной ул. без линий прыгать, просто положить \п
в начале первого аргумента второй заменить:
.replace('\n | ',' ')`.
Примечание: белая линия между " и...шаблоны." и "также, ..." и требует пробела после символа"|".
Вы также можете разместить SQL-операторов в действие отдельный файл.SQL` и загрузить его в файл py с
with open('action.sql') as f:
query = f.read()
Так что SQL-операторы будут отделены от кода Python. Если есть параметры в SQL-оператор, который должен быть заполнен с Python, вы можете использовать строку форматирования (таких как %S или {поле})
Я использую рекурсивную функцию для построения сложных SQL-запросов. Этот метод обычно могут быть использованы для построения больших строк при сохранении читабельности кода.
# Utility function to recursively resolve SQL statements.
# CAUTION: Use this function carefully, Pass correct SQL parameters {},
# TODO: This should never happen but check for infinite loops
def resolveSQL(sql_seed, sqlparams):
sql = sql_seed % (sqlparams)
if sql == sql_seed:
return ' '.join([x.strip() for x in sql.split()])
else:
return resolveSQL(sql, sqlparams)
П. С.: Посмотрите на удивительный питон-sqlparse библиотека для печати SQL-запросов, если это необходимо. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
Другой вариант, который я думаю, является более удобочитаемым, если код (электронная.переменная г) изрезана и выходной строке должен быть один лайнер (нет строки):
def some_method():
long_string = """
a presumptuous long string
which looks a bit nicer
in a text editor when
written over multiple lines
""".strip('\n').replace('\n', ' ')
return long_string
Тл;др: использовать в "" и" и\
и в "" и"
в том, чтобы обернуть строку, а в
запах мяты строку = " и&;&;\ Это длинная строка занимающие несколько строк. " и" и"в
С официальной документации Python:
строковые литералы могут занимать несколько строк. Одним из способов является использование тройной цитаты: " и" и" от..." и" и" или '''...'''. Конец строки автоматически включены в строку, но можно предотвратить это путем добавления \ в конце строки. В следующем примере:
печать(" и" и" в\ Использование: штука [опции] -H отображает это сообщение использование -Ч hostname имя узла для подключения к " и" на глаз")
выдает следующий результат (обратите внимание, что начальные строки не В комплекте):
Использование: штука [опции] -H отображает это сообщение использование -Ч hostname имя узла для подключения к
Мне нравится этот подход, потому что это привилегии для чтения. В тех случаях, когда у нас есть длинные строки нет! В зависимости от уровня отступа и по-прежнему ограничивается 80 символов в строке... ну... не надо ничего говорить. На мой взгляд, по стилю Python руководства все еще очень неопределенно. Я взял подход @Эро Аалтонен, потому что привилегии чтения и здравого смысла. Я понимаю, что стиль руководства должен помогать нам, а не сделать нашу жизнь беспорядок. Спасибо!
class ClassName():
def method_name():
if condition_0:
if condition_1:
if condition_2:
some_variable_0 =\
"""
some_js_func_call(
undefined,
{
'some_attr_0': 'value_0',
'some_attr_1': 'value_1',
'some_attr_2': '""" + some_variable_1 + """'
},
undefined,
undefined,
true
)
"""