У меня очень длинный запрос. Я хотел бы разбить его на несколько строк в 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
python
string
multiline
multilinestring
Пабло Мешер
источник
источник
Ответы:
Вы говорите о многострочных строках? Легко, используйте тройные кавычки, чтобы начать и закончить их.
Вы также можете использовать одинарные кавычки (3 из них, конечно, в начале и в конце) и обрабатывать полученную строку так
s
же, как любую другую строку.ПРИМЕЧАНИЕ . Как и в случае с любой строкой, все, что находится между начальной и конечной кавычками, становится частью строки, поэтому в этом примере есть начальный пробел (на что указывает @ root45). Эта строка также будет содержать пробелы и переводы строк.
Т.е. ,:
Наконец, можно также построить длинные строки в Python следующим образом:
который не будет содержать никаких дополнительных пробелов или новых строк (это преднамеренный пример, показывающий, к чему приведет эффект пропуска пробелов):
Запятые не требуются, просто поместите строки, которые нужно объединить, в пару круглых скобок и обязательно учтите все необходимые пробелы и символы новой строки.
источник
+
оператора не приводит к конкатенации во время выполнения?textwrap.dedent
для удаления нежелательных ведущих пробелов. docs.python.org/3/library/textwrap.html#textwrap.dedentЕсли вам не нужна многострочная строка, а просто длинная однострочная строка, вы можете использовать скобки, просто убедитесь, что вы не включаете запятые между строковыми сегментами, тогда это будет кортеж.
В операторе SQL, подобном тому, что вы строите, многострочные строки также подойдут. Но если бы дополнительный пробел, содержащийся в многострочной строке, был бы проблемой, тогда это был бы хороший способ достичь того, чего вы хотите.
источник
,
'
?.format(...)
после закрывающей скобки.%
форматирование нотации тоже должно работать, но я не пробовал' foo '+variable
не будет работать, но' foo '+variable+''
будет работать.Прерывание линий
\
работает для меня. Вот пример:источник
longStr = "account: " + account_id + \ ...
the backslash is redundant between brackets
когда я писал изнутриprint()
Я нашел себя счастливым с этим:
источник
.replace('\t','')
Я обнаружил, что при построении длинных строк вы обычно делаете что-то вроде создания SQL-запроса, и в этом случае это лучше всего:
То, что предложил Левон, хорошо, но может быть уязвимо для ошибок:
источник
Вы также можете объединять переменные при использовании нотации "" ":
РЕДАКТИРОВАТЬ: нашел лучший способ, с именованными параметрами и .format ():
источник
Этот подход использует:
только одна обратная косая черта, чтобы избежать начального перевода строкипомощьюinspect
модуляtextwrapaccount_id
иdef_id
переменных.Этот способ выглядит наиболее питонным для меня.
Обновление : 29.01.2009 Включить предложение @ ShadowRanger для использования
inspect.cleandoc
вместоtextwrap.dedent
источник
inspect.cleandoc
немного лучше , чемtextwrap.dedent
, поскольку он не требует первой линии , чтобы быть пустыми с символом продолжения строки в конце.inspect.cleandoc
для этого.В Python> = 3.6 вы можете использовать форматированные строковые литералы (f строка)
источник
Например:
если значение условия должно быть строкой, вы можете сделать это так:
источник
Я нахожу
textwrap.dedent
лучшее для длинных строк, как описано здесь :источник
Другие уже упоминали метод круглых скобок, но я хотел бы добавить, что с круглыми скобками разрешены встроенные комментарии.
Комментарий к каждому фрагменту:
Комментарий не разрешен после продолжения:
При использовании продолжения строки с обратной косой чертой (
\
) комментарии не допускаются. Вы получитеSyntaxError: unexpected character after line continuation character
ошибку.Лучшие комментарии для строк Regex:
Основываясь на примере с https://docs.python.org/3/library/re.html#re.VERBOSE ,
источник
Лично я считаю, что следующий способ - лучший (простой, безопасный и Pythonic) способ написания необработанных SQL-запросов на Python, особенно при использовании модуля sqlite3 в Python :
Pros
Cons
?
местозаполнителем, может оказаться немного сложным отследить, какую из них?
заменить какой переменной Python, когда их много в запросе.источник
cursor.execute(query.format(vars))
. Это должно заботиться о вашем единственном "мошенничестве" (я надеюсь).format
было бы неплохо, но я не уверен, будет ли строка запроса, отформатированная таким образом, безопасна для внедрения SQL.cursor.execute(query.format(vars))
не нужно, вы больше не получаете прибыль от подготовленных операторов, так что вы уязвимы для многих видов проблем, начиная с того факта, что если параметры не просто числа, вам нужно заключить их в кавычки в SQL-запросе.Я обычно использую что-то вроде этого:
Если вы хотите удалить надоедливые пробелы в каждой строке, вы можете сделать следующее:
источник
textwrap.dedent
функцию Python , которая находится в стандартной библиотеке, она обладает необходимой вам функциональностью.inspect.cleandoc
немного лучше (менее требователен к тому, появляется ли текст в той же строке, что и открытые кавычки, не требует явных символов продолжения строки).Ваш фактический код не должен работать, вам не хватает пробельные в конце «линии» (например:
role.descr as roleFROM...
)Для многострочной строки есть тройные кавычки:
Он будет содержать разрывы строк и лишние пробелы, но для SQL это не проблема.
источник
Вы также можете поместить SQL-оператор в отдельный файл
action.sql
и загрузить его в py-файл с помощьюТаким образом, SQL-операторы будут отделены от кода Python. Если в выражении sql есть параметры, которые необходимо заполнить из python, вы можете использовать форматирование строки (например,% s или {field})
источник
Путь "а- ля" Скала (но я думаю, что это самый питонический путь, как того требует OQ):
Если вам нужен последний str без переходов, просто поместите
\n
в начале первого аргумента второй замены:Примечание: белая линия между «... шаблонами». и "Кроме того ..." требует пробела после
|
.источник
tl; dr: используйте
"""\
и"""
для переноса строки , как вИз официальной документации по питону :
источник
Эй, попробуйте что-то вроде этой надежды, это работает, как в этом формате, он вернет вам непрерывную строку, как вы успешно спросили об этом свойстве`
источник
Я использую рекурсивную функцию для построения сложных запросов SQL. Этот метод обычно может использоваться для создания больших строк при сохранении читабельности кода.
PS: взгляните на потрясающую библиотеку python-sqlparse, чтобы при необходимости распечатывать запросы SQL. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format
источник
Другой вариант, который, на мой взгляд, более читабелен, когда код (например, переменная) имеет отступ, а выходная строка должна быть однострочной (без новых строк):
источник
Используйте тройные кавычки. Люди часто используют их для создания строк документации в начале программы, чтобы объяснить их назначение и другую информацию, относящуюся к ее созданию. Люди также используют их в функциях, чтобы объяснить назначение и применение функций. Пример:
источник
Мне нравится этот подход, потому что он дает право на чтение. В тех случаях, когда у нас длинные струны, это невозможно! В зависимости от уровня отступа вы находитесь и до сих пор ограничены 80 символами в строке ... Ну ... Больше ничего не нужно говорить. На мой взгляд, руководства по питонскому стилю все еще очень расплывчаты. Я выбрал подход @Eero Aaltonen, потому что он дает преимущество в чтении и здравом смысле. Я понимаю, что руководства по стилю должны помочь нам, а не сделать нашу жизнь беспорядочной. Спасибо!
источник
Из официальной документации по питону :
источник
Для определения длинной строки внутри dict, сохранения новых строк, но без пробелов , я в итоге определил строку в константе, подобной этой:
источник
В качестве общего подхода к длинным строкам в Python вы можете использовать тройные кавычки
split
иjoin
:Вывод:
Что касается вопроса OP, относящегося к запросу SQL, в ответе ниже игнорируется правильность этого подхода к построению запросов SQL, и основное внимание уделяется только созданию длинных строк удобочитаемым и эстетичным способом без дополнительного импорта. Это также не учитывает вычислительную нагрузку, которая влечет за собой.
Используя тройные кавычки, мы строим длинную и читаемую строку, которую затем разбиваем на список, используя
split()
таким образом пробелы и затем соединяем их вместе' '.join()
. Наконец, мы вставляем переменные с помощьюformat()
команды:Производит:
Изменить: этот подход не соответствует PEP8, но я считаю его полезным иногда
источник
Вообще, я использую
list
иjoin
для многострочных комментариев / строк.Вы можете использовать любую строку, чтобы присоединиться ко всему этому элементу списка, например '
\n
' (новая строка ) или ',
' (запятая) или '' (пробел)
Ура .. !!
источник