f-string에서 개행 문자 '\ n'을 사용하여 Python 3.6에서 출력 형식을 지정하는 방법은 무엇입니까?


121

이 경우를 f- 문자열로 Pythonic 방식으로 형식화하는 방법을 알고 싶습니다.

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)

문제는 f- 문자열 '\'{...}표현식 부분 내에서 사용할 수 없다는 것 입니다. 예상 출력 :

Winners are:
Adam
Bob
Cyril

11
f"Winners are:\n{chr(10).join(names)}"
wim

답변:


133

당신은 할 수 없습니다. 백 슬래시는 중괄호 안에 나타날 수 없습니다 {}. 이렇게하면 다음과 같은 결과가 나타납니다 SyntaxError.

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash

이것은 f- 문자열 에 대한 PEP 에 지정되어 있습니다.

백 슬래시는 f- 문자열의 표현식 부분에 나타나지 않을 수 있습니다. [...]

한 가지 옵션은 '\n'이름을 지정한 다음 -string .join내부에있는 f것입니다. 즉, 리터럴을 사용하지 않습니다.

names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)

결과 :

Winners are:
Adam
Bob
Cyril

@wim에 지정된 또 다른 옵션 chr(10)\n반환 된 다음 거기에 참여하는 데 사용 하는 것입니다.f"Winners are:\n{chr(10).join(names)}"

물론 또 다른 방법은 '\n'.join사전에 이름을 추가하는 것입니다.

n = "\n".join(names)
text = f"Winners are:\n{n}"

결과는 동일한 결과입니다.

노트 :

이것은 f-strings와 str.format. 후자의 경우 해당 키가 포함 된 괴상한 사전의 압축을 풀 때 부여 된 구두점을 항상 사용할 수 있습니다.

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"

(이러지 마세요.)

전자에서는 구두점을 사용하는 식별자를 가질 수 없기 때문에 구두점을 사용할 수 없습니다.


옆으로 : 다른 답변이 대안으로 제안 했듯이 나는 확실히 print또는을 선택할 것 format입니다. 내가 제공 한 옵션 은 어떤 이유로 든 f- 문자열 을 사용해야 하는 경우에만 적용됩니다 .

새로운 것이 있다고해서 모든 것을 시도해야한다는 의미는 아닙니다 ;-)


55

구분 기호가있는 문자열 목록을 인쇄하기 위해 f- 문자열 또는 기타 포맷터가 필요하지 않습니다. sep키워드 인수를 사용하여 다음 을 수행하십시오 print().

names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='\n')

산출:

Winners are:
Adam
Bob
Cyril

즉, 여기에서 str.join()/를 사용 str.format()하는 것은 f- 문자열 해결 방법보다 더 간단하고 읽기 쉽습니다.

print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))

13
지금까지 최고의 답변입니다. 요즘에는 인쇄 기능에서 별표 풀기 기능을 사용하여 print(*dir(some_object), sep='\n')또는 print(*vars(some_object), sep='\n').
릭 모니카 지원

1
목록을 직접 인쇄하지 않으려면 (예 : 로거에 전달하는 경우) 어떻게합니까?
bob

1
@bob : 그런 다음 사용하십시오 str.join(): text = '\n'.join(['Winners are:', *names]). BTW print()모든 파일 에 쓰는 데 사용할 수 있습니다 ( 기본적으로 file인수로 지정됨 sys.stdout).
Eugene Yarmash

11

다른 사람들이 말했듯이 f- 문자열에 백 슬래시를 사용할 수는 없지만 다음을 사용하여이 문제를 해결할 수 있습니다 os.linesep(하지만 \n모든 플랫폼에 적용되는 것은 아니며 바이너리 파일을 읽거나 쓰지 않는 한 권장되지 않습니다. Rick의 주석 참조 ).

>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril 

또는 가독성이 떨어지는 방식이지만 다음 \nchr()같이 보장됩니다 .

>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril

2
내가 아니었지만 텍스트를 쓸 때 사용 하는 것은 좋은 생각os.linesep아닙니다 .
릭 모니카 지원

1
@RickTeachey 나는 이미 괄호 안에 경고를 추가하고 다른 접근 방식을 제안했습니다. 어쨌든, 영업 이익은 텍스트 모드로 연 파일에 기록되지 화면에 인쇄하는
Chris_Rands

나는 그것이 중요하다고 생각하지 않는다. os.linesep그냥 읽기 또는 읽기와 이진 모드에서 쓰기 위해 . 이 경우에도 똑같이 작동한다는 것을 알고 있지만 시작하는 것은 나쁜 습관입니다. 그러나 다시 말하지만 나는 반대표가 아니었다. 경고는 나에게 충분합니다. :)
릭 모니카 지원

7

다른 답변은 개행 문자를 f- 문자열 필드에 넣는 방법에 대한 아이디어를 제공합니다. 그러나 나는 OP가 제시 한 예 (OP의 실제 사용 사례를 나타낼 수도 있고 아닐 수도 있음)의 경우 이러한 아이디어 중 어느 것도 실제로 사용해서는 안된다고 주장합니다.

f- 문자열 사용의 요점은 코드 가독성을 높이는 것입니다. 으로 할 수없는 f- 문자열로 할 수있는 일은 없습니다 format. 이에 대해 더 읽을 수있는 것이 있는지 신중하게 고려하십시오 (할 수 있다면).

f"Winners are:\n{'\n'.join(names)}"

...아니면 이거:

newline = '\n'
f"Winners are:\n{newline.join(names)}"

...아니면 이거:

"Winners are:\n{chr(10).join(names)}"

대 이것 :

"Winners are:\n{}".format('\n'.join(names))

마지막 방법은 적어도 읽을 수있는 정도입니다.

요컨대, 반짝이는 새 드라이버가 있다고해서 드라이버가 필요할 때 망치를 사용하지 마십시오. 코드는 작성된 것보다 훨씬 더 자주 읽습니다.

다른 사용 사례의 경우 chr(10)아이디어 나 newline아이디어가 적절할 수 있습니다. 그러나 주어진 사람에게는 아닙니다.


7
가독성은 주관적입니다. :) ... 오래된 관행은 숙련 된 사람에게 적합하며 어떤 경우에는 더 읽기 쉬울 수 있지만 멍청한 사람에게는 거의 알려지지 않아 읽을 수 없습니다. 철학적 관점에서 죄송합니다.
malmed

2
@malmed 가독성은 일반적으로 주관적이지 않습니다. 이 경우에는 확실히 아닙니다. 그러나 그것은 길게 논쟁 할 가치가 없습니다.
릭 모니카 지원

1
@malmed 당신은 가독성이 이전 경험에 의해 훈련 될 수 있다는 의미에서 "주관적"이라는 것이 맞습니다 . 그러나 우리의 두뇌와 감각에는 한계가 있기 때문에 가독성은 관련 텍스트를 스캔하는 것이 물리적으로 얼마나 쉬운 지, 인간의 두뇌가 얼마나 자주 패턴과 일치하는 경향이 있는지, 다른 사람에 대한 우리의 두뇌 예측에 얼마나 정확한 힌트를 주는지를 객관적으로 측정 할 수 있습니다. 코드 (문의 시작 / 끝이 무엇인지 암시하는 줄 포함), 초보자가 얼마나 쉽게 읽을 수 있는지.
mtraceur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.