파이썬에서이 긴 줄을 어떻게 나눌 수 있습니까?


176

이 같은 긴 줄을 어떻게 포맷하겠습니까? 너비가 80 자 이하 여야합니다.

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

이것이 최선의 선택입니까?

url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))

1
좋은 옵션 인 것 같습니다. 당신은 그것에 대해 무엇을 좋아하지 않습니까?
Hamish Grubijan

2
조금 주관적이지 않습니까? :)
Adam Woś

1
관련 : stackoverflow.com/questions/1940710/… (파이썬에서 문자열 연결)
jldupont

14
"it 's"에서 잘못된 '를 제거하여 문자를 저장할 수 있습니다.
jball

2
indexes:의 복수형은 index입니다 indices.
Scruuffy

답변:


336

시작입니다. 더 긴 문자열을 사용하는 코드 외부에서 더 긴 문자열을 정의하는 것은 나쁜 습관이 아닙니다. 데이터와 동작을 분리하는 방법입니다. 첫 번째 옵션은 문자열 리터럴을 서로 인접하게하여 암시 적으로 결합하는 것입니다.

("This is the first line of my text, "
"which will be joined to a second.")

또는 줄 끝 연속으로 사용하면 조금 더 깨지기 쉽습니다.

"This is the first line of my text, " \
"which will be joined to a second."

그러나 이것은하지 않습니다 :

"This is the first line of my text, " \ 
"which will be joined to a second."

차이점을 보시겠습니까? 아니? 글쎄 당신은 그것이 코드 일 때도하지 않을 것입니다.

암시 적 조인의 단점은 변수에서 가져온 문자열이 아닌 문자열 리터럴에서만 작동하므로 리팩토링 할 때 상황이 약간 더 커질 수 있다는 것입니다. 또한 결합 된 문자열의 서식 만 전체적으로 보간 할 수 있습니다.

또는 연결 연산자 ( +)를 사용하여 명시 적으로 결합 할 수 있습니다 .

("This is the first line of my text, " + 
"which will be joined to a second.")

zen of python이 말한 것처럼 명시 적은 암시 적보다 낫습니다. 그러나 이것은 하나가 아닌 세 개의 문자열을 생성하고 두 배의 메모리를 사용합니다. 선을 무시할시기를 알아야합니다. 거꾸로하면 각 행의 하위 문자열에 개별적으로 서식을 적용하거나 괄호 외부의 전체 로트에 서식을 적용 할 수 있습니다.

마지막으로 삼중 인용 문자열을 사용할 수 있습니다.

"""This is the first line of my text
which will be joined to a second."""

이것은 종종 내가 좋아하는 것이지만, 줄 바꿈과는 조금 다르지만 후속 줄의 선행 공백이 최종 문자열에 표시됩니다. 이스케이프 백 슬래시를 사용하여 줄 바꿈을 제거 할 수 있습니다.

"""This is the first line of my text \
which will be joined to a second."""

올바른 코드가 보이지 않는 공백으로 인해 잘못된 코드와 만 다르다는 점에서 위의 동일한 기술과 동일한 문제가 있습니다.

어느 것이 "가장 좋은지"는 특정 상황에 따라 다르지만 그 대답은 단순히 미적인 것이 아니라 미묘하게 다른 행동 중 하나입니다.


26
CPython 컴파일러는 가능한 한 리터럴 연산을 최적화합니다. 즉, 두 개의 문자열 리터럴을 추가하면 바이트 코드에서 단일 문자열 리터럴 만 생성됩니다.
Ignacio Vazquez-Abrams

2
내가받은 모든 답변이 도움이되지만 문자열을 분해하는 모든 방법을 이해하는 데 도움이됩니다. "\"줄에 문제가있어서 그 뒤에 공백이 있었습니까?
Gattster

1
나는 여기서 차이점을 볼 수 없지만, 그것은 주로 SO의 다소 원시적 인 구문 색상 때문입니다. (일부 완벽하게 좋은 코드는 SO에서 거의 읽을 수 없지만 구문이 C와 매우 유사한 언어가 아니기 때문에 만 가능합니다.) 편집기가 후미 공백을 강조 표시하는 것은 드문 일이 아닙니다. . :-)
Ken

1
@KhurshidAlam 작은 따옴표 '를 사용 하여 해당 문자열을 포함하거나 문자열 내에서 큰 따옴표를 이스케이프하거나 삼중 큰 따옴표를 사용할 수 있습니다 """. 따옴표가 포함 된 따옴표로 묶인 문자열의 문제는 리터럴 문자열을 정의하기 위해 한 줄 또는 여러 줄을 사용하는지 여부와 동일합니다.
hugovdberg 2016 년

1
편집자는 항상 후행 공백을 제거합니다. 동일한 설정을 사용하는 것이 좋습니다. 물론 새 줄의 공백은 여전히 ​​문자열의 일부이므로을 사용했습니다 +.
ThaJay

46

연속적인 문자열 리터럴은 컴파일러에 의해 결합되며 괄호로 묶은 표현식은 한 줄의 코드로 간주됩니다.

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))

11

개인적으로 나는 열린 블록을 매달려 싫어하므로 다음과 같이 형식화합니다.

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.'
    .format(line[indexes['url']], video.title)
)

일반적으로 80 열 줄에 코드를 정확히 맞추기 위해 너무 힘들지 않습니다. 줄 길이를 적당한 수준으로 낮추는 것이 가치가 있지만, 80 한계는 과거의 일입니다.


8
실제로 과거의 일이 아닙니다. Python 표준 라이브러리는 여전히 PEP8을 스타일 가이드로 사용하므로 규칙이 여전히 존재하며 많은 사람들 (자체 포함)이이를 따릅니다. 선을 그리는 것이 편리한 곳입니다.
Devin Jeanpierre

3
나는 아직도 얼마나 많은 프로젝트가 80 문자 규칙을 따르는 지 궁금합니다. 내가 사용하는 평균 창 크기의 경우 100-120이 80 자보다 더 생산적이라고 생각합니다.
Gattster

1
그렇습니다, 그것은 내가 사용하는 줄 길이에 관한 것입니다. sacrilege!] 비례 글꼴을 사용하므로 정확한 줄 길이는 그리 중요하지 않습니다. 한 줄의 로직이 읽을 수있는 문자 수보다 많은 경우가 더 많습니다. 누구도 읽을 필요가없는 긴 데이터 문자열이있는 경우 유출 할 수있어서 기쁩니다. (120)
bobince

코드를위한 비례 폰트 – 저는 당신과 함께 있습니다. 내가 함께 일한 모든 사람들이 그들을 위해 겪었던 혼란에 의해 판단 할 때, 세상은 아직 준비가되어 있지 않다.
jlarcombe

4
~ 80자를 사용하면 동일한 화면에서 2 개의 파일을 나란히 쉽게 구분할 수 있습니다. 또한 서버 콘솔에서 심각한 비상 사태 동안 디버깅을하는 경우 80 자 제한에 감사드립니다! :)
Mick T

4

textwrap 모듈을 사용하여 여러 줄로 나눌 수 있습니다

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

로부터 문서 :

텍스트 랩. wrap (text [, width [, ...]])
단일 행을 텍스트 (문자열)로 랩핑하여 모든 행이 최대 너비 문자를 갖도록합니다. 마지막 줄 바꿈없이 출력 줄 목록을 반환합니다.

선택적 키워드 인수는 TextWrapper아래에 설명 된 의 인스턴스 속성에 해당 합니다. 너비는 기본적으로 70입니다.

TextWrapper.wrap()wrap () 동작에 대한 추가 세부 사항 은 메소드를 참조하십시오 .


2

.format()긴 문자열 을 호출하려고 시도 하고 후속 .format(호출 을 중단하지 않고 가장 인기있는 문자열 줄 바꿈 기술 을 사용할 수없는 사람은 str.format("", 1, 2)대신에 할 수 있습니다 "".format(1, 2). 이를 통해 원하는 기술로 문자열을 끊을 수 있습니다. 예를 들면 다음과 같습니다.

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

될 수있다

logger.info(str.format(("Skipping {0} because its thumbnail was already"
+ "in our system as {1}"), line[indexes['url']], video.title))

그렇지 않으면, 유일한 가능성은 개인적으로 팬이 아닌 줄 끝 연속을 사용하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.