긴 여러 줄 문자열을 만드는 Pythonic 방법


1304

매우 긴 쿼리가 있습니다. 파이썬에서 여러 줄로 나누고 싶습니다. JavaScript 로하는 방법은 여러 문장을 사용하고 +연산자 와 결합하는 것입니다 (아마도 가장 효율적인 방법은 아니지만이 단계의 성능에 대해서는 신경 쓰지 않습니다. 코드 가독성 만) . 예:

var long_string = 'some text not important. just garbage to' +
                  'illustrate my example';

파이썬에서 비슷한 것을 시도했지만 작동하지 않았으므로 \긴 문자열을 분할하는 데 사용 되었습니다. 그러나 이것이 유일하고 / 최고의 / 최신적인 방법인지 확실하지 않습니다. 어색해 보인다. 실제 코드 :

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

207
예제는 주입 공격을 기다리는 SQL 블록처럼 보이므로 다른 제안은 SQLAlchemy와 같은 상위 수준의 SQL 라이브러리 또는 이와 같은 원시 SQL을 함께 해킹하지 않도록하는 것입니다. (아마도 주제를 벗어난 것이지만, "모든 제안"을 요청한 적이 있습니다.;)
John Gaines Jr.

6
이것은 " 긴 문자열에 대해 여러 줄로 된 코드 를 만드는 일반적인 방법" 입니다. 줄 바꿈이 포함 된 문자열을 만들려면 textwrap.dedent를 참조하십시오 .
Bob Stein

8
@cezar 5 년 이상 전에이 질문을 썼지 만 긴 SQL 쿼리를 여러 줄에 올바르게 넣는 방법을 알지 못했기 때문에이 질문을 기억합니다. 나는 그 긴 문자열로 바보 같은 일을하고 있다는 것에 동의하지만 그것은 내 질문이 아니었고 SQL 주입 문제가 포함되지 않은 더 좋은 예를 찾을만큼 똑똑하지 못했습니다.
Pablo Mescher

@cezar 아니오, 이것은 XY 문제가 아니며 쿼리는 여러 줄로 구성되는 것이 가장 좋습니다. SQLi는 당면한 질문과 관련이 없습니다. 그러나 대담한 경고는 완전히 정당화됩니다 :)
bugmenot123

나는 이것을 위해 작은 패키지를 썼다. 예 : stackoverflow.com/a/56940938/1842491
Shay

답변:


2225

여러 줄 문자열에 대해 이야기하고 있습니까? 쉽게 시작하고 끝내려면 삼중 따옴표를 사용하십시오.

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 ...'

마지막으로 파이썬에서 다음과 같이 긴 줄을 만들 수도 있습니다.

 s = ("this is a very"
      "long string too"
      "for sure ..."
     )

여기 에는 여분의 공백이나 줄 바꿈이 포함 되지 않습니다 (공백을 건너 뛰면 어떤 결과가 나오는지 보여주는 의도적 인 예입니다).

'this is a verylong string toofor sure ...'

쉼표가 필요하지 않습니다. 간단히 문자열을 한 쌍의 괄호로 묶고 필요한 공백과 줄 바꿈을 고려해야합니다.


8
두 번째 방법에는 "+"연산자를 명시 적으로 사용하는 것이 좋습니다. 번거롭지 않고 가독성이 향상됩니다.
Marco Sulla

38
@LucasMalor 인접한 문자열은 컴파일 타임 연결입니다. +연산자를 사용하지 않으면 런타임에 연결이 발생 하지 않습니까?
Joshua Taylor

13
참고로, 여기에이 현상에 대한 공식 문서입니다 : docs.python.org/2/reference/... (파이썬 2) docs.python.org/3/reference/... (파이썬 3)
neverendingqs

4
귀하의 예는 좋지만 변수 데이터를 쿼리에 안전하고 안전하게 포함시키는 방법을 보여주기를 바랍니다. OP 및 @jessee 예제 코드는 모두 올바르게 수행하지 않는 방법을 보여줍니다 (SQL 공격에 대한 초대). 또한보십시오 : dev.mysql.com/doc/connector-python/en/…
Scott Prive

2
textwrap.dedent불필요한 선행 공백을 제거 하는 데 사용할 수 있습니다 . docs.python.org/3/library/textwrap.html#textwrap.dedent
코리 골드버그

190

여러 줄 문자열을 원하지 않고 긴 한 줄 문자열 만있는 경우 괄호를 사용할 수 있습니다. 문자열 세그먼트 사이에 쉼표를 포함시키지 않으면 튜플이됩니다.

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 문에서 여러 줄 문자열도 좋습니다. 그러나 여러 줄 문자열에 포함 된 여분의 공백이 문제가 될 경우 원하는 것을 달성하는 좋은 방법입니다.


1
@Pablo 다음에 댓글을 달 수도 있습니다,
Ashwini Chaudhary

@ 200OK 당신은 후에 의미 '합니까?
kon psych

3
이 문자열을 형식화하는 다른 방법 .format(...)은 닫는 괄호 뒤에 추가하는 것 입니다. %서식 표기법도 작동해야하지만 시도하지 않았습니다.
kon psych

3
각 줄은 문자열 상수로 끝나야하므로 ' foo '+variable작동하지 않지만 작동 ' foo '+variable+''합니다.
yoyo

46
이 예제는 SQL 인젝션 공격에 대한 열린 문입니다. 아무도 공공 응용 프로그램에서 이것을 사용하지 마십시오. '자리 표시 자'를 사용하는 방법은 MySQL 문서를 참조하십시오 : dev.mysql.com/doc/connector-python/en/…
Scott Prive

138

\나를 위해 일 함으로써 줄을 끊는 것. 예를 들면 다음과 같습니다.

longStr = "This is a very long string " \
        "that I wrote to help somebody " \
        "who had a question about " \
        "writing long strings in Python"

9
나는 트리플 따옴표 표기법을 선호하거나 \ 문자로 감싸는 것을 선호합니다
Khanh Hua

14
다음 줄의 시작 부분에 공백을 두는 것이 좋습니다. 이런 식으로 실수로 빠진 것이 더 분명합니다 (따라서 일어날 가능성이 적습니다).
Alfe

또한 줄의 끝에서 변수와 함께 작동합니다longStr = "account: " + account_id + \ ...
frmbelz

나는 다음과 같은 오류가 발생합니다 : the backslash is redundant between brackets내가 안으로 쓸 때print()
alper

50

나는 이것에 만족했다.

string = """This is a
very long string,
containing commas,
that I split up
for readability""".replace('\n',' ')

31
동의하지 않는다. 첫 줄 ( "string = ...")을 많이 들여 쓰면 어떻게됩니까? 들여 쓰기가 0이 아닌 다음 줄을 dedent해야합니다.
xjcl

1
글쎄, 대부분의 긴 문자열은 모듈 수준에서 발생합니다. 귀하의 경우에는 이것이 최선의 해결책이 아닐 것입니다.
Eero Aaltonen

1
나는이 접근 방식이 읽기 권한이 있기 때문에 좋아합니다. 우리가 긴 줄을 가지고있는 경우에는 방법이 없습니다 ... 들여 쓰기 수준에 따라 줄 당 80 자로 제한됩니다 ... 음 ... 다른 말을 할 필요가 없습니다. 필자의 관점에서 파이썬 스타일 가이드는 여전히 모호합니다. 감사!
Eduardo Lucio 2016 년

이 모듈에서 사용되는 경우이 이렇게 추한 것, 나는 또한에있는.replace('\t','')
alper

44

긴 문자열을 만들 때 일반적으로 SQL 쿼리 작성과 같은 작업을 수행하는 것이 좋습니다.이 경우 가장 좋습니다.

query = ' '.join((  # note double parens, join() takes an iterable
    "SELECT foo",
    "FROM bar",
    "WHERE baz",
))

Levon이 제안한 것은 좋지만 실수에 취약 할 수 있습니다.

query = (
    "SELECT foo"
    "FROM bar"
    "WHERE baz"
)

query == "SELECT fooFROM barWHERE baz"  # probably not what you want

8
+1 코드 검토자가 모든 행의 오른쪽 끝에서 부적절한 공백 을 확실하게 확인하지 않아도됩니다 . OP는 @KarolyHorvath가 지적한 것처럼이 실수를 여러 번 저지른 바 있습니다.
Bob Stein

2
비슷한 방식으로 코딩 된 여러 줄 문자열을 검토 할 때 쉽게 확인할 수 있도록 모든 줄 의 왼쪽 끝에 적절한 공백이 필요합니다 .
우산

3
@ BobStein-VisiBone 코드 리뷰는 구문 오류나 이와 같은 작은 버그에 대한 것이 아니어야합니다. 누군가 구문 오류가있는 코드를 검토하여 (또는 전혀 또는 특정 상황에서 실행되지 않는 경우) 심각한 문제가 있습니다. 커밋하기 전에 보푸라기를 실행하는 것은 어렵지 않습니다. 그 사람이 명백한 실수를했기 때문에 프로그램이 제대로 실행되지 않는 것을 눈치 채지 못하면 커밋해서는 안됩니다.
Charles Addis

1
@CharlesAddis에 동의 한 코드 검토는 린트, 구문 강조 등과 같은 자동화 된 방법을 따라야합니다. 그러나 일부 공백 누락 버그는 그런 식으로 잡히지 않을 수 있습니다. 버그를 방지 할 수있는 모든 합리적인 이점을 활용하십시오.
Bob Stein

33

"" "표기법을 사용할 때 변수를 연결할 수도 있습니다.

foo = '1234'

long_string = """fosdl a sdlfklaskdf as
as df ajsdfj asdfa sld
a sdf alsdfl alsdfl """ +  foo + """ aks
asdkfkasdk fak"""

편집 : 이름이 params 및 .format () 인 더 나은 방법을 찾았습니다.

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)

26

이 방법은 다음을 사용합니다.

  • 초기 줄 바꿈을 피하기 위해 백 슬래시 하나만
  • 삼중 따옴표로 묶인 문자열을 사용하여 내부 구두점이 거의 없음
  • 텍스트 랩을 사용하여 로컬 들여 쓰기를 제거합니다 . inspect 모듈을 합니다.
  • account_iddef_id변수에 파이썬 3.6 형식의 문자열 보간 ( 'f')을 사용합니다 .

이 방법은 나에게 가장 파이썬처럼 보입니다.

# 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의 제안 inspect.cleandoc대신 사용 제안textwrap.dedent


5
참고 : 끝에 줄 연속 문자를 사용하여 첫 번째 줄을 비울 필요가 없으므로 보다 inspect.cleandoc약간 좋습니다 textwrap.dedent.
ShadowRanger 2016 년

2
@ShadowRanger 와우 전에는 cleandoc을 사용한 적이 없습니다. 나는 대답을 업데이트했으며 나중에 inspect.cleandoc이것을 사용할 것입니다 .
Christopher Bruns

23

Python> = 3.6에서는 형식화 된 문자열 리터럴 (f 문자열)을 사용할 수 있습니다.

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}'''

4
여러 줄로 된 문자열의 결과를 기록하고 왼쪽 탭 / 공백을 표시하지 않으려면 f- 문자열이 어떻게 작동합니까?
kuanb

7
SQL 인젝션에 여전히 취약
Trenton

19

예를 들면 다음과 같습니다.

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'

condition 값이 문자열이어야하는 경우 다음과 같이 할 수 있습니다.

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'"

13

내가 찾을 textwrap.dedent설명 긴 문자열을 위해 최선을 여기 :

def create_snippet():
    code_snippet = textwrap.dedent("""\
        int main(int argc, char* argv[]) {
            return 0;
        }
    """)
    do_something(code_snippet)

1
나는 자동 줄 바꿈을 방지하는 블랙 슬래시를 좋아한다.
zyy

12

다른 사람들은 이미 괄호 방법을 언급했지만 괄호를 사용하여 인라인 주석이 허용되도록 추가하고 싶습니다.

각 조각에 대한 의견 :

nursery_rhyme = (
    'Mary had a little lamb,'          # Comments are great!
    'its fleece was white as snow.'
    'And everywhere that Mary went,'
    'her sheep would surely go.'       # What a pesky sheep.
)

계속 후 설명이 허용되지 않습니다.

백 슬래시 줄 연속 ( \)을 사용하는 경우 주석이 허용되지 않습니다. 당신은 받게됩니다 SyntaxError: unexpected character after line continuation character오류가 발생했습니다.

nursery_rhyme = 'Mary had a little lamb,' \  # These comments
    'its fleece was white as snow.'       \  # are invalid!
    'And everywhere that Mary went,'      \
    'her sheep would surely go.'
# => SyntaxError: unexpected character after line continuation character

정규식 문자열에 대한 더 나은 주석 :

https://docs.python.org/3/library/re.html#re.VERBOSE 의 예제를 기반으로 ,

a = re.compile(
    r'\d+'  # the integral part
    r'\.'   # the decimal point
    r'\d*'  # some fractional digits
)
# Using VERBOSE flag, IDE usually can't syntax highight the string comment.
a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)

10

개인적으로 다음은 Python에서 sqlite3 모듈을 사용할 때 Python에서 원시 SQL 쿼리를 작성하는 가장 좋은 (간단하고 안전하며 Pythonic) 방법이라는 것을 개인적으로 알았습니다 .

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 변수로 대체 해야하는지 추적하기가 약간 어려워 질 수 있습니다.

참고로 테스트하지는 않았지만 관련 장소에서 물음표를 "{0} {1} {2}"(으)로 바꾸고 마지막 줄을로 변경하여 물음표 혼동을 피할 수 있습니다 cursor.execute(query.format(vars)). 그것은 당신의 유일한 "죄수"를 돌봐야합니다.
Ben

예, 사용하는 format것이 좋지만 그런 식으로 형식이 지정된 쿼리 문자열이 SQL 삽입에서 안전한지 확실하지 않습니다.
Faheel

예, 그것은 공평한 점이며 확실히 조금 까다로울 수 있습니다. 아마도 완전히 소비 가능한 것으로 테스트하는 것이 현명 할 것입니다 ... 의심 할 여지없이 Comp. 공상 과학 언더 그레이드는 곧 지나갈 것입니다. ;)
Ben

2
@Ben이 cursor.execute(query.format(vars))더 이상 준비된 문장에서 이익을 얻지 못하면 매개 변수가 숫자가 아니라면 SQL 쿼리에서 큰 따옴표로 묶어야한다는 사실부터 시작하여 많은 종류의 문제에 취약합니다.
Patrick Mevzek

4

나는 보통 다음과 같은 것을 사용합니다 :

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())

2
textwrap.dedent표준 라이브러리에있는 Python의 기능 을 살펴보면 필요한 기능이 있습니다.
bjd2385 2016 년

@ bjd2385 : inspect.cleandoc약간 낫다 (텍스트가 열린 따옴표와 같은 줄에 나타나는지에 대해서는 덜 까다 롭고, 명시적인 줄 연속 문자가 필요하지 않음).
ShadowRanger

3

실제 코드는 "선"의 끝에 공백 누락, 작동하지합니다 (예 : role.descr as roleFROM...)

여러 줄로 된 문자열에는 세 개의 따옴표가 있습니다 :

string = """line
  line2
  line3"""

줄 바꿈과 추가 공백이 포함되지만 SQL의 경우 문제가되지 않습니다.


3

sql-statement를 별도의 파일 action.sql에 배치하고 py 파일에로드 할 수도 있습니다.

with open('action.sql') as f:
   query = f.read()

따라서 sql-statements는 파이썬 코드와 분리됩니다. sql 문에 파이썬으로 채워야하는 매개 변수가 있으면 문자열 형식을 사용할 수 있습니다 (예 : % s 또는 {field}).


3

"À la" 스칼라 방식 (그러나 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('            | ',' ')

점프 라인이없는 최종 str을 원한다면 \n두 번째 replace의 첫 번째 인수 시작 부분에 넣으십시오 .

.replace('\n            | ',' ')`.

참고 : "... 템플릿"사이의 흰색 선 그리고 "또한 ..."뒤에는 공백이 필요합니다 |.


3

TL; DR : 사용 """\하고 """문자열을 감싸는 같이,

string = """\
This is a long string
spanning multiple lines.
"""

로부터 공식 파이썬 문서 :

문자열 리터럴은 여러 줄에 걸쳐있을 수 있습니다. 한 가지 방법은 "" "..." ""또는 '' '...' ''와 같이 삼중 따옴표를 사용하는 것입니다. 줄 끝은 문자열에 자동으로 포함되지만 줄 끝에 \를 추가하면이를 방지 할 수 있습니다. 다음 예제는

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

다음 출력을 생성합니다 (초기 개행 문자는 포함되지 않음).

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

2

이 형식과 같이이 속성에 대해 성공적으로 문의 한 것처럼 연속적인 줄을 반환하는 것과 같이이 희망과 같은 것을 시도하십시오.

"message": f'you have successfully inquired about '
           f'{enquiring_property.title} Property owned by '
           f'{enquiring_property.client}'

1

재귀 함수를 사용하여 복잡한 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)

추신 : 필요한 경우 SQL 쿼리를 예쁘게 인쇄하는 멋진 python-sqlparse 라이브러리를 살펴보십시오. http://sqlparse.readthedocs.org/en/latest/api/#sqlparse.format


"재귀 함수"는 람다라고하는 것이 아닙니까?
m3nda 2016 년

1

코드 (예 : 변수)가 들여 쓰기되고 출력 문자열이 하나의 라이너 (줄 바꿈 없음) 일 때 더 읽기 쉽다고 생각하는 다른 옵션은 다음과 같습니다.

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 

1

큰 따옴표를 사용하십시오. 사람들은 종종 그것들을 사용하여 프로그램 시작시 자신의 목적과 그 생성과 관련된 다른 정보를 설명하기 위해 docstring을 만듭니다. 사람들은 또한 함수의 목적과 응용을 설명하기 위해 함수에서 이것을 사용합니다. 예:

'''
Filename: practice.py
File creator: me
File purpose: explain triple quotes
'''


def example():
    """This prints a string that occupies multiple lines!!"""
    print("""
    This
    is 
    a multi-line
    string!
    """)

0

나는 읽기 권한이 있기 때문에이 접근법을 좋아합니다. 우리가 긴 줄을 가지고있는 경우에는 방법이 없습니다! 들여 쓰기 수준에 따라 줄당 80 자로 제한됩니다 ... 글쎄 ... 다른 말을 할 필요가 없습니다. 필자의 관점에서 파이썬 스타일 가이드는 여전히 모호합니다. @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
)
"""

0

로부터 공식 파이썬 문서 :

문자열 리터럴은 여러 줄에 걸쳐있을 수 있습니다. 한 가지 방법은 "" "..." ""또는 '' '...' ''와 같이 삼중 따옴표를 사용하는 것입니다. 줄 끝은 문자열에 자동으로 포함되지만 줄 끝에 \를 추가하면이를 방지 할 수 있습니다. 다음 예제는

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

다음 출력을 생성합니다 (초기 개행 문자는 포함되지 않음).


0

dict 안에 긴 문자열을 정의 하고 개행을 유지하면서 공백을 생략하기 위해 문자열을 다음과 같이 상수로 정의했습니다.

LONG_STRING = \
"""
This is a long sting
that contains newlines.
The newlines are important.
"""

my_dict = {
   'foo': 'bar',
   'string': LONG_STRING
}

0

파이썬에서 긴 문자열에 대한 일반적인 접근 방식으로는 삼중 따옴표를 사용, 수 splitjoin:

_str = ' '.join('''Lorem ipsum dolor sit amet, consectetur adipiscing 
        elit, sed do eiusmod tempor incididunt ut labore et dolore 
        magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
        ullamco laboris nisi ut aliquip ex ea commodo.'''.split())

산출:

'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo.'

SQL 쿼리와 관련된 OP의 질문과 관련하여 아래 답변은 SQL 쿼리 작성에 대한이 접근 방식의 정확성을 무시하고 추가 가져 오기없이 읽기 쉽고 심미적 인 방식으로 긴 문자열을 작성하는 데에만 중점을 둡니다. 또한 이것이 수반하는 계산 부하도 무시합니다.

삼중 따옴표를 사용하여 길고 읽기 쉬운 문자열을 작성하여 split()공백을 제거하여 목록으로 나누고 다시 결합합니다 ' '.join(). 마지막으로 다음 format()명령을 사용하여 변수를 삽입합니다 .

account_id = 123
def_id = 321

_str = '''
    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 = {}
    '''

query = ' '.join(_str.split()).format(account_id, account_id, def_id)

생산 :

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 = 123 AND record_def.account_id=123 AND def_id=321

편집 :이 접근법은 PEP8과 일치하지 않지만 때때로 유용합니다.


-7

일반적으로, 내가 사용 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'(newline) 또는 ' ,'(쉼표) 또는 ' 와 같은이 목록 요소를 모두 결합 할 수 있습니다. '(space)

건배..!!


1
왜 적어도 배열 리터럴을 사용하지 않습니까?
Alexander-복원 모니카

1
배열은 클래스 목록으로 표시됩니다. 배열 리터럴에 관한 또 다른 토론을 확인하십시오
paone

이것이 효과가 있다고 생각하지만 성능과 가독성에 대해 생각해야합니다 ...
Petro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.