2010-01-13 4 views
103

긴 줄을 어떻게 포맷 하시겠습니까? 나는 그것을 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

좋은 옵션처럼 보입니다. 그것에 대해 싫어하는 점은 무엇입니까? –

+2

조금 주관적이지 않습니까? :) –

+1

관련 : http://stackoverflow.com/questions/1940710/syntax-quirks-or-why-is-that-valid-python (파이썬에서 문자열 연결) – jldupont

답변

213

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

"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.") 

명시 적, 암시 적보다 낫다,하지만이 세 가지 문자열 대신 중 하나를 생성하고, 두 번 사용 많은 기억이 있습니다 : 당신이 작성한 두 개와 함께 합쳐진 두 개가 있습니다. 그래서 선 (禅)을 언제 무시해야 하는지를 알아야합니다. 단점은 각 줄에 별도로 하위 문자열을 지정하거나 괄호 외부에서 전체 롯트에 서식을 적용 할 수 있다는 것입니다. 이것은 줄 바꿈 및 후속 행에 선행 공백이 최종 문자열에 표시됩니다으로 그 동작이 약간 다릅니다하지만, 종종 내가 좋아하는

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

올바른 코드가 보이지 않는 공백으로 만 다른 점은 올바른 코드와 위의 동일한 기술과 동일한 문제입니다.

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

+15

CPython 컴파일러는 리터럴 연산을 최대한 최적화합니다. 즉, 두 개의 문자열 리터럴을 추가하면 바이트 코드의 문자열 리터럴이 하나만됩니다. –

+1

내가받은 답변이 모두 도움이 되긴하지만, 문자열을 끊을 수있는 모든 방법을 이해하는 데 도움이됩니다. 그 뒤에 공백이있는 "\"행의 문제가 있었습니까? – Gattster

+0

여기서 차이점을 볼 수는 없지만, 그 이유는 주로 SO의 다소 기본적인 구문 색칠 때문입니다. (일부 완벽하게 좋은 코드는 실제로는 읽을 수 없지만, 구문이 C와 매우 유사한 언어로만되어 있기 때문에 가능합니다.) 편집기가 불필요하게 후행 공백을 강조하게하는 것은 드문 일이 아닙니다. 거의 유용하지 않기 때문에 (또는 의도적으로) . :-) – Ken

27

연속 문자열 리터럴은 컴파일러에 의해 결합되고, 표현식은 단 한 줄의 코드로 간주됩니다 괄호 :

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

가 개인적으로 나는이 열려 블록을 걸려 싫어, 그래서으로 포맷 것 :

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

일반적으로 나는 80 열 라인 내에 정확하게 코드를 맞추기 위해 너무 열심히 노력하지 않을 것이다. 라인 길이를 합리적인 수준으로 유지하는 것은 가치가 있지만 하드 80 한도는 과거의 것입니다.

+6

정말 과거의 일이 아닙니다. 파이썬 표준 라이브러리는 여전히 PEP8을 스타일 가이드로 사용하기 때문에 규칙은 여전히 ​​존재하며, 많은 사람들이 그것을 따라합니다. 선을 그릴 수있는 편리한 장소입니다. –

+2

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

+1

네, 그게 제가 사용하는 줄 길이에 관한 것입니다, [공포! 신중한 글꼴을 사용하므로 정확한 줄 길이가 그렇게 중요하지 않습니다. 한 줄에 얼마나 많은 논리가 얼마나 많은 문자보다 더 읽기 쉬운 지에 대한 사례입니다 ... 아무도 읽을 필요가없는 긴 문자열을 가지고 있다면, 나는 그것을 넘치게합니다. 120. – bobince

관련 문제