Programming

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

procodes 2020. 6. 4. 21:24
반응형

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


이 같은 긴 줄을 어떻게 포맷하겠습니까? 너비가 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))

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

("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이 말한 것처럼 명시 적은 암시 적보다 낫습니다. 그러나 이것은 1 대신 3 개의 문자열을 생성하고 두 배나 많은 메모리를 사용합니다. 선을 무시할시기를 알아야합니다. 거꾸로하면 각 행의 하위 문자열에 개별적으로 서식을 적용하거나 괄호 외부의 전체 로트에 서식을 적용 할 수 있습니다.

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

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

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

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


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

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

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

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

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


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

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

ABCDEFGH
IJKLIMNO

로부터 문서 :

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

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

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


For anyone who is also trying to call .format() on a long string, and is unable to use some of the most popular string wrapping techniques without breaking the subsequent .format( call, you can do str.format("", 1, 2) instead of "".format(1, 2). This lets you break the string with whatever technique you like. For example:

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

can be

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

Otherwise, the only possibility is using line ending continuations, which I personally am not a fan of.

참고URL : https://stackoverflow.com/questions/2058925/how-can-i-break-up-this-long-line-in-python

반응형