이 같은 긴 줄을 어떻게 포맷하겠습니까? 너비가 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이 말한 것처럼 명시 적은 암시 적보다 낫습니다. 그러나 이것은 하나가 아닌 세 개의 문자열을 생성하고 두 배의 메모리를 사용합니다. 선을 무시할시기를 알아야합니다. 거꾸로하면 각 행의 하위 문자열에 개별적으로 서식을 적용하거나 괄호 외부의 전체 로트에 서식을 적용 할 수 있습니다.
마지막으로 삼중 인용 문자열을 사용할 수 있습니다.
"""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 () 동작에 대한 추가 세부 사항 은 메소드를 참조하십시오 .
답변
.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))
그렇지 않으면, 유일한 가능성은 개인적으로 팬이 아닌 줄 끝 연속을 사용하는 것입니다.