파이썬에서 줄 바꿈 (줄 연속)을 어떻게 할 수 있습니까?


1074

여러 줄로 나누고 싶은 긴 코드 줄이 있습니다. 무엇을 사용하고 구문은 무엇입니까?

예를 들어 문자열 묶음을 추가하면

e = 'a' + 'b' + 'c' + 'd'

다음과 같이 두 줄로 표시하십시오.

e = 'a' + 'b' +
    'c' + 'd'

답변:


1210

선은 무엇입니까? 문제없이 다음 줄에 인수를 사용할 수 있습니다.

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)

그렇지 않으면 다음과 같이 할 수 있습니다.

if a == True and \
   b == False

자세한 내용 은 스타일 가이드 를 확인하십시오.

예제 라인에서 :

a = '1' + '2' + '3' + \
    '4' + '5'

또는:

a = ('1' + '2' + '3' +
    '4' + '5')

스타일 가이드에 따르면 괄호와 함께 암시 적 연속을 사용하는 것이 바람직하지만이 경우에는 식 주위에 괄호를 추가하는 것이 잘못된 방법 일 수 있습니다.


35
사실, 스타일 가이드의 선호도는 거꾸로되어 있습니다. 암시 적 연속이 선호되며, 명시적인 백 슬래시는 필요한 경우에만 사용해야합니다.
Carl Meyer

35
Carl : 나는 동의하지 않는다. 이것은 긴 줄을 감싸는 가장 좋은 방법은 괄호, 괄호 및 중괄호 안에 파이썬의 묵시적 줄 연속을 사용하는 것입니다. 필요한 경우 표현식 주위에 괄호 쌍을 추가 할 수 있지만 때로는 백 슬래시를 사용하는 것이 좋습니다.
Jerub

15
스타일 가이드 인용문의 핵심 부분은 "필요한 경우 표현식 주위에 괄호 쌍을 추가 할 수 있지만 때로는 백 슬래시를 사용하는 것이 좋습니다."입니다. 스타일 가이드는 괄호 를 추가 해야한다고 말하지 않으며 작가의 판단에 맡깁니다.
Tony Meyer

23
아마도 PEP-8은 이러한 주석이 추가 된 이후로 변경되었습니다. 긴 줄을 감싸려면 괄호를 추가해야한다는 것이 명백해 졌기 때문입니다.
다니엘

46
PEP8은 2010 년에 실제로 변경되었습니다. "때로 백 슬래시를 사용하는 것이 더 좋아 보입니다".
e100

230

PEP 8 부터 -파이썬 코드를위한 스타일 가이드 :

긴 줄을 줄 바꿈하는 가장 좋은 방법은 괄호, 괄호 및 중괄호 안에 파이썬의 묵시적 줄 연속을 사용하는 것입니다. 긴 줄은 식을 괄호로 묶어 여러 줄로 나눌 수 있습니다. 라인 연속에 백 슬래시를 사용하는 것보다 우선적으로 사용해야합니다.

백 슬래시는 여전히 적절한 경우가 있습니다. 예를 들어 길고 여러 개의 with 문은 암시 적 연속을 사용할 수 없으므로 백 슬래시를 사용할 수 있습니다.

with open('/path/to/some/file/you/want/to/read') as file_1, \
        open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

또 다른 경우는 주장 진술입니다.

연속 줄을 적절히 들여 쓰십시오. 이진 연산자를 돌파하기 위해 선호되는 장소 는 연산자가 아닌 연산자 입니다. 몇 가지 예 :

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
                color == 'red' and emphasis == 'strong' or
                highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

PEP8은 이제 가독성을 향상시키기 위해 수학자 및 출판사가 사용 하는 반대의 규칙 (이진 연산 중단)을 권장합니다 .

이항 연산자 이전 의 도널드 크 누스 (Donald Knuth)의 브레이킹 스타일은 연산자를 세로로 정렬하여 어떤 항목을 더하고 빼는 지 결정할 때 눈의 작업량을 줄입니다.

에서 : PEP8 해야 전이나 이항 연산자 후 줄 바꿈? :

Donald Knuth는 자신의 컴퓨터 및 조판 시리즈에서 전통적인 규칙을 설명합니다. "단락 ​​내의 수식은 항상 이진 연산 및 관계 후에 끊어 지지만 표시된 수식은 항상 이진 연산 전에 끊어집니다"[3].

수학의 전통을 따르면 일반적으로 더 읽기 쉬운 코드가 생성됩니다.

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

파이썬 코드에서는 규칙이 로컬로 일관성이있는 한 이진 연산자 전후에 중단 할 수 있습니다. 새로운 코드의 경우 Knuth의 스타일이 제안됩니다.

[3] : Donald Knuth의 The TeXBook, 195 및 196 페이지


3
NB 권장 사항은 2010 년에 변경되었습니다. "긴 줄은 괄호로 묶어 줄 수 있습니다. 백 슬래시를 사용하는 것보다 우선적으로 사용해야합니다."코드 예제에서 모든 백 슬래시가 제거되었습니다.
e100

1
@ e100 : 위의 굵게 표시된 텍스트를 읽으십시오 : The preferred way .. is by using Python's implied line continuation inside parentheses와 동일합니다 by wrapping expressions in parentheses. 예를 업데이트했습니다
jfs

10
그러나 "때로 백 슬래시를 사용하는 것이 더 좋아 보인다"는 점에 유의하십시오.
e100


6
2015 년 스타일 가이드는 가독성의 개선 된 개선으로 인해 Donald Knuth가 연구 한 후 이진 연산자 보다 먼저 중단 선호하도록 업데이트되었습니다 .
J2C

70

백 슬래시를 사용하여 줄을 끝내는 위험은 백 슬래시 뒤에 공백을 추가하면 (물론보기가 매우 어렵습니다) 백 슬래시는 더 이상 생각했던대로 작동하지 않습니다.

자세한 내용은 Python Idioms 및 Anti-Idioms ( Python 2 또는 Python 3 )를 참조하십시오.


8
이것이 후행 공백을 더 잘 볼 수있는 좋은 이유 중 하나입니다. 즉 set list listchars=trail:·, vim 과 같은 것 입니다. :)
Beau

25

을 넣어 \당신의 행의 끝에서 또는 괄호에있는 문을 묶습니다 ( .. ). 에서 IBM :

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))

또는

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)

24

괄호와 중괄호 사이에서 줄을 바꿀 수 있습니다. 또한 백 슬래시 문자 \를 줄에 추가하여 명시 적으로 분리 할 수 ​​있습니다.

x = (tuples_first_value,
     second_value)
y = 1 + \
    2

20

말의 입에서 : 명시 적 라인 결합

\다음과 같이 두 개 이상의 실제 줄은 백 슬래시 문자 ( )를 사용하여 논리 줄에 결합 될 수 있습니다 . 백 슬래시와 다음 줄 끝 문자를 삭제합니다. 예를 들면 다음과 같습니다.

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

백 슬래시로 끝나는 줄은 주석을 포함 할 수 없습니다. 백 슬래시는 주석을 계속하지 않습니다. 백 슬래시는 문자열 리터럴을 제외하고 토큰을 계속하지 않습니다 (즉, 문자열 리터럴 이외의 토큰은 백 슬래시를 사용하여 실제 행으로 분할 할 수 없음). 백 슬래시는 문자열 리터럴 외부의 행에서 불법입니다.


7
예제는 단조로운 IMO이므로 -1입니다. 복합 조건은 대신 대괄호로 묶을 수 있으며, 이는보다 실용적인 (편집 또는 자동 리 래핑) 관용적입니다.
u0b34a0f6ae 2009

4

파이썬 방식이 아닐 수도 있지만 일반적으로 SQL 쿼리와 같이 긴 문자열을 작성하기 위해 조인 함수가있는 목록을 사용합니다.

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])

2

히치하이커를위한 파이썬 가이드 ( 라인 연속 ) :

논리적 코드 줄이 허용 된 제한보다 길면 여러 물리적 줄로 나누어야합니다. 행의 마지막 문자가 백 슬래시이면 Python 인터프리터는 연속 행에 참여합니다. 이것은 어떤 경우에는 도움이되지만, 취약성 때문에 일반적으로 피해야합니다. 백 슬래시 후 줄 끝에 추가 된 공백은 코드를 깨뜨리고 예기치 않은 결과를 초래할 수 있습니다.

더 나은 솔루션은 요소 주위에 괄호를 사용하는 것입니다. 줄 끝에서 닫히지 않은 괄호를 남겨두면 파이썬 인터프리터는 괄호가 닫힐 때까지 다음 줄에 참여합니다. 중괄호와 대괄호에도 동일한 동작이 적용됩니다.

그러나 긴 논리 행을 분할해야하는 것은 종종 너무 많은 일을하려고한다는 의미이므로 가독성을 방해 할 수 있습니다.

말했듯이, 다음은 여러 가져 오기 ( PEP-8에 정의 된 행 제한을 초과 할 때 )를 일반적으로 문자열에 적용하는 예입니다.

from app import (
    app, abort, make_response, redirect, render_template, request, session
)

1

긴 리터럴 문자열로 인해 줄을 나누려면 해당 문자열을 조각으로 나눌 수 있습니다.

long_string = "a very long string"
print("a very long string")

로 대체됩니다

long_string = (
  "a "
  "very "
  "long "
  "string"
)
print(
  "a "
  "very "
  "long "
  "string"
)

두 인쇄 문 모두에 대한 출력 :

a very long string

애정에 괄호가 있습니다.

리터럴 문자열을 조각으로 나누면 문자열의 일부에서만 리터럴 접두사를 사용할 수 있습니다.

s = (
  "2+2="
  f"{2+2}"
)

0

사용 행 계속 연산자 예 : "\")를

예 :

# Ex.1

x = 1
s =  x + x**2/2 + x**3/3 \
       + x**4/4 + x**5/5 \
       + x**6/6 + x**7/7 \
       + x**8/8
print(s)
# 2.7178571428571425


----------


# Ex.2

text = ('Put several strings within parentheses ' \
        'to have them joined together.')
print(text)


----------


# Ex.3

x = 1
s =  x + x**2/2 \
       + x**3/3 \
       + x**4/4 \
       + x**6/6 \
       + x**8/8
print(s)
# 2.3749999999999996
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.