Подходящие для Python способ создать ДЛИННЫЕ многострочные строки
у меня очень длинный запрос. Я хотел бы разделить его на несколько строк в Python. Способ сделать это в JavaScript будет использовать несколько предложений и объединение их с + оператор (Я знаю, может быть, это не самый эффективный способ сделать это, но я действительно не беспокоюсь о производительности на этом этапе, просто читаемость кода). Пример:
var long_string = 'some text not important. just garbage to' +
'illustrate my example';
Я попытался сделать что-то подобное в Python, но это не сработало, поэтому я использовал чтобы разделить длинную строку. Однако, я не конечно, если это единственный/лучший/pythonicest способ сделать это. Это выглядит неловко.
Фактический код:
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
19 ответов:
вы говорите о многострочных строк? Легко, используйте тройные кавычки, чтобы начать и закончить их.
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"""EDIT: нашел лучший способ, с именем 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 вы можете использовать форматированные строковые литералы (F string)
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}'''
например:
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'"
Я лично считаю, что это лучший (простой, безопасный и Pythonic) способ писать необработанные SQL-запросы в Python, особенно при использовании модуль sqlite3 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 = ? 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плюсы
- аккуратный и простой код (Pythonic!)
- Безопасный от инъекции SQL
- совместим как с Python 2, так и с Python 3 (в конце концов, это Pythonic)
- не требуется конкатенация строк
- нет нужно убедиться, что самый правый символ каждой строки является пробел
минусы
- так как переменные в запросе заменяются на
?заполнитель, это может стать немного трудно отслеживать, какие?должен быть заменен на какую переменную Python, когда их много в запросе.
найти
textwrap.dedentлучшее для длинных строк, как описано здесь:def create_snippet(): code_snippet = textwrap.dedent("""\ int main(int argc, char* argv[]) { return 0; } """) do_something(code_snippet)
ваш фактический код не должен работать, вам не хватает пробелов в конце "линии" (например:
role.descr as roleFROM...)есть триплекоты для многострочной строки:
string = """line line2 line3"""Он будет содержать переносы строк и лишние пробелы, но для SQL это не проблема.
этот подход использует только одну обратную косую черту, чтобы избежать начальной подачи строки, почти без внутренней пунктуации с помощью тройной строки в кавычках, удаляет локальный отступ с помощью модуля textwrap, а также использует интерполяцию строк в формате python 3.6 ('f') для
account_idиdef_idпеременные. Этот способ выглядит наиболее подходящие для Python для меня.import textwrap query = textwrap.dedent(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}''' )
Я обычно использую что-то вроде этого:
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())
вы также можете поместить sql-оператор в отдельный файл
action.sqlи загрузите его в файл py с помощьюwith open('action.sql') as f: query = f.read()таким образом, sql-операторы будут отделены от кода python. Если в инструкции sql есть параметры, которые необходимо заполнить из python, вы можете использовать форматирование строк (например, %s или {field})
"меню" Скала путь (но я думаю, что это самый питонический путь, как требует OQ):
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(' | ',' ')если вы хотите final str без линий перехода, просто поместите
\nв начале первого аргумента второй заменить:.replace('\n | ',' ')`.Примечание: белая линия между "...шаблоны."и" тоже ..."требуется пробел после
|.
Я использую рекурсивную функцию для построения сложных 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)P. S:посмотрите на удивительную библиотеку python-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
Мне нравится этот подход, потому что он дает привилегии чтения. В тех случаях, когда у нас есть длинные строки нет! В зависимости от уровня отступа и по-прежнему ограничено 80 символами в строке... Что ж... Не нужно больше ничего говорить. На мой взгляд, руководства по стилю python все еще очень расплывчаты. Я взял подход @Eero Aaltonen, потому что он привилегирует чтение и здравый смысл. Я понимаю, что руководство по стилю должно помочь нам и не сделать нашу жизнь беспорядком. Спасибо!
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 ) """
как правило, я использую
listиjoinдля многострочных комментариев/строку.lines = list() lines.append('SELECT action.enter code here descr as "action", ') lines.append('role.id as role_id,') lines.append('role.descr as role') lines.append('FROM ') lines.append('public.role_action_def,') lines.append('public.role,') lines.append('public.record_def, ') lines.append('public.action') query = " ".join(lines)вы можете использовать любую строку, чтобы присоединиться ко всему этому элементу списка, например'
\n'(перевод строки) или ','(запятая) или ''(пробел)ваше здоровье..!!
Comments