파이썬의 다양한 문자열 형식화 방법 — 오래된 것 (예정)은 더 이상 사용되지 않습니까?


106

파이썬은 적어도 6 가지 방법으로 문자열을 포맷합니다 :

In [1]: world = "Earth"

# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'

# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'

# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'

# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'

# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'

In [7]: from string import Template

# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'

다양한 방법에 대한 간략한 역사 :

  • printf스타일 형식은 파이썬 초기부터 사용되었습니다.
  • Template클래스는 Python 2.4에서 도입되었습니다.
  • format메서드는 Python 2.6에서 도입되었습니다.
  • f-strings는 Python 3.6에서 도입되었습니다.

내 질문은 다음과 같습니다.

  • 가요 printf스타일의 서식이 사용되지 않거나 사용되지 않는 될 것?
  • 에서 Template class의 인 substitute방법이 사용되지 않거나 사용되지 않는 될 것? (내가 safe_substitute이해하는대로 고유 한 기능을 제공하는 에 대해 말하는 것이 아닙니다. )

비슷한 질문과 중복되지 않는 이유 :

  • 파이썬 문자열 형식 : % 대 .format — 방법 1과 2 만 처리하고 어느 것이 더 나은지 묻습니다. 내 질문은 Zen of Python에 비추어 사용 중단에 관한 것입니다.

  • 문자열 형식화 옵션 : 장단점 — 질문의 방법 1a 및 1b, 답변의 1 및 2 만 처리하며 지원 중단에 대해서는 아무것도 처리하지 않습니다.

  • 고급 문자열 형식화 vs 템플릿 문자열 — 대부분 방법 1과 3에 관한 것으로, 지원 중단을 다루지 않습니다.

  • 문자열 형식화 표현식 (Python)원래의 '%'접근 방식이 더 이상 사용되지 않을 계획이라고 답변합니다 . 그러나 deprecated 예정 , 보류중인 deprecation 및 실제 deprecation 의 차이점은 무엇 입니까? 그리고 printf-style 메서드는조차도 발생시키지 않습니다 PendingDeprecationWarning. 그래서 이것은 정말로 더 이상 사용되지 않을까요? 이 게시물도 꽤 오래되어 정보가 오래되었을 수 있습니다.

또한보십시오


1
Formatter수업 을 잊었다는 점을 지적해야 합니까?
Martijn Pieters

답변:


14

문서에는 .format및 f- 문자열이 문자열보다 우수하다는 다양한 표시가 있지만 %, 후자를 폐기 할 계획은 아직 없습니다.

커밋 이슈 # 14123 : 이전 스타일의 % 문자열 형식에는주의 사항이 있지만 곧 사라지지 않을 것이라고 명시 적으로 언급합니다. , in issue에서 영감을 얻음 현재 printf 스타일 형식을 폐기 할 계획이 없음을 나타내십시오 . %-formatting에 대한 문서 는 다음 문구를 포함하도록 편집되었습니다.

새로운 문자열 형식 지정 구문이 더 유연하고 튜플과 사전을 자연스럽게 처리하므로 새 코드에 권장됩니다. 그러나 현재 printf 스타일 형식 지정을 중단 할 계획은 없습니다 .

(강조 광산.)

이 문구는 나중에 커밋 Close # 4966 에서 제거되었습니다 : 최신 Python의 상태를 더 잘 설명하기 위해 시퀀스 문서를 수정했습니다 . 이것은 %포맷 을 폐기하려는 계획 이 카드에 다시 등장했다는 신호처럼 보일 수 있지만 버그 추적기를 살펴보면 의도가 반대임을 알 수 있습니다. 버그 추적기에서 커밋 작성자는 다음 과 같이 변경 사항을 특성화합니다 .

  • printf 스타일 형식과 str.format 메서드 사이의 관계를 설명하는 산문을 변경했습니다 (전자가 사라질 위험이 있다는 의미를 고의적으로 제거합니다. 우리가 그것을 죽이는 것을 진지하게 고려하는 것은 단순히 실용적이지 않습니다)

즉, 제거는 말할 ​​것도없고 더 이상 사용되지 않을 것임을 명시 적으로 강조% 하기 위해 -formatting 문서 에 대해 두 번의 연속 변경 사항이 있습니다. 문서는 다른 종류의 문자열 형식화의 상대적인 장점에 대해 의견이 있지만 -formatting이 더 이상 사용되지 않거나 제거되지 않을 것임을 분명히합니다 .%

또한 2017 년 3 월 에 해당 단락에 대한 가장 최근의 변경 사항으로 인해 변경 되었습니다.

여기에 설명 된 형식 지정 작업은 여러 가지 일반적인 오류 (예 : 튜플 및 사전을 올바르게 표시하지 못함)로 이어지는 다양한 단점을 나타냅니다. 최신 형식의 문자열 리터럴 또는 str.format인터페이스를 사용하면 이러한 오류를 방지하는 데 도움이됩니다. 이러한 대안은 텍스트 서식 지정에 대해보다 강력하고 유연하며 확장 가능한 접근 방식을 제공합니다.

... 이에:

여기에 설명 된 형식 지정 작업은 여러 가지 일반적인 오류 (예 : 튜플 및 사전을 올바르게 표시하지 못함)로 이어지는 다양한 단점을 나타냅니다. 새로운 형식의 문자열 리터럴, str.format인터페이스 또는 템플릿 문자열을 사용하면 이러한 오류를 방지하는 데 도움이 될 수 있습니다. 이러한 각 대안은 단순성, 유연성 및 / 또는 확장 성이라는 고유 한 장단점과 이점을 제공합니다.

"피하는 데 도움이 됨"에서 "피하는 데 도움이 될 수 있음"으로의 변경 사항과 .format각 스타일이 "자신의 장단점과 이점을 제공" 하는 방법에 대한 푹신하고 모호한 산문으로 명확한 권장 사항 과 f- 문자열이 어떻게 대체되었는지 확인하십시오 . 즉, 공식적인 지원 중단이 더 이상 카드에 표시되지 않을뿐만 아니라 현재 문서는 %형식이 다른 접근 방식에 비해 "장점"이 있음을 공개적으로 인정하고 있습니다.

나는이 모든 것으로부터 %서식 을 비난하거나 제거하려는 움직임 이 흔들 렸을뿐만 아니라 철저하고 영구적으로 패배 했다고 추론 합니다.


2
솜털 언어 변경은 Mercurial의 사용을 근절하기에는 너무 큰 코드베이스로 남겨진 Mercurial을보고 싶지 않은 Mercurial 관리자를 달래기 위해 추가되었습니다 %. 이제 '대규모 코드 모드 없음'정책이 폐기되었으므로 이의 제기도 사라지고 있습니다. 장기적으로 % 는 어떤 시점에서 어떤 이점도 남기지 않고 두 양식을 모두 유지 하면 printf 구문이 제거됩니다. 우리는 아직 언제인지 알지 못하기 때문에 언어를 낮출 가치가있었습니다.
Martijn Pieters

@MartijnPieters 흥미 롭습니다. 제가 부족한이 결정에 대해 많은 지식을 가지고 계신 것 같습니다. 그만한 가치가있는 점에 대해서는 (새로운 답변 또는 기존 답변에 대한 편집으로) 이러한 요점을 설명하는 잘 참조 된 답변이 가치가있을 것이라고 생각합니다.
Mark Amery

58

새로운 .format()방법 은 이전 %형식화 구문 을 대체하기위한 것 입니다. 후자는 강조되지 않았지만 아직 공식적으로 사용되지 않습니다 . 메서드 문서에는 다음과 같은 내용이 나와 있습니다.

문자열 형식의이 방법은 파이썬 3의 새로운 표준이며, 선호한다 받는 사람 %에 설명 된 서식 문자열 포맷 작업 새로운 코드.

(강조 광산).

이전 버전과의 호환성을 유지하고 쉽게 전환 할 수 있도록 지금 은 이전 형식이 그대로 유지되었습니다 . 원래 PEP 3101 제안에서 :

이전 버전과의 호환성

기존 메커니즘을 그대로두면 이전 버전과의 호환성을 유지할 수 있습니다. 새 시스템은 기존 문자열 형식화 기술의 메소드 이름과 충돌하지 않으므로 이전 시스템을 폐기 할 때까지 두 시스템이 공존 할 수 있습니다.

이전 시스템을 폐기 할 때가 올 때까지 유의하십시오 . 더 이상 사용되지 않지만 새 코드 를 작성할 때마다 새 시스템이 사용됩니다 .

새로운 시스템은 이전 포맷터 의 튜플과 사전 접근 방식을 결합 할 수 있다는 장점이 있습니다 %.

"{greeting}, {0}".format(world, greeting='Hello')

object.__format__()개별 값의 형식을 처리하는 데 사용되는 후크를 통해 확장 할 수 있습니다.

이전 시스템에는 %Template클래스 가 있었으며 후자는 동작을 추가하거나 변경하는 하위 클래스를 만들 수 있습니다. 새로운 스타일의 시스템은 같은 틈새 시장을 채우는 Formatter클래스 를 가지고 있습니다.

Python 3은 더 이상 사용되지 않는 대신 printf-style String Formatting 섹션 에서 경고를 표시 합니다 .

참고 : 여기에 설명 된 형식 지정 작업은 여러 가지 일반적인 오류 (예 : 튜플 및 사전을 올바르게 표시하지 못함)를 유발하는 다양한 단점을 나타냅니다. 최신 형식의 문자열 리터럴 또는 str.format()인터페이스를 사용하면 이러한 오류를 방지하는 데 도움이됩니다. 이러한 대안은 텍스트 서식 지정에 대해보다 강력하고 유연하며 확장 가능한 접근 방식을 제공합니다.

Python 3.6은 또한 형식 문자열 에 식 인라인하는 형식화 된 문자열 리터럴을 추가했습니다 . 이것은 보간 된 값으로 문자열을 만드는 가장 빠른 방법이며 str.format()리터럴을 사용할 수 있는 곳이 아닌 곳에서 사용해야합니다.


4
그리고 개체에서 사용 Formatter하는 것과 같은 사용자 지정 형식을 만들 수 있습니다 datetime. 또한 .format은 함수이므로이를 사용하여 호출 가능한 lazy 형식화를보다 직접적으로 만들 수 있습니다. 예 :fmt = '{} - {}'.format; fmt(a, b)
Jon Clements

나는 표시되지 않습니다 Template관련이 %나에 이전 시스템 . 특히 당신이 연결하는 PEP 는이 제안과 사이에 약간의 겹침이 있지만 string.Template, 각각은 뚜렷한 필요를 제공하고 하나는 다른 것을 제거하지 않는다고 느낍니다. 귀하의 답변 Template에서 이전 시스템의 일부인 서식 도 더 이상 사용되지 않는다는 사실을 혼동 할 수 있습니다 .
Bakuriu

@Bakuriu : 맞아, 나는 그 부분을 놓친 것 같다; 하지만 제 생각에는 Formatter수업이 string.Template().
Martijn Pieters

1
[...]should be preferred to the % formatting[...]이 부분은 문서에서 제거되었습니다. docs.python.org/3/library/stdtypes.html#str.format
AXO

나는이 답변이 현재 오해의 소지가 있다고 생각합니다. 인용 된 첫 번째 구절은 Python 3 문서에서 제거되었으며, 더 이상 사용되지 않을 의도가 남아 있지 않다는 것이 상당히 분명해 보입니다. 이 답변은 여전히 ​​역사적 가치가 있지만, 사용 중단이 여전히 카드에 있다는 제안을 피하고 답변의 전반부 대부분을 과거형으로 편집하기 위해 문구를 조정하는 경향이 있습니다. 이의를 제기하지 않으면 언젠가는 내가 그렇게 할 것이지만, 원한다면 스스로 그러한 변화를 할 수있는 기회를주기 위해 먼저 언급하겠다고 생각했습니다.
Mark Amery

45

%문자열 형식에 대한 연산자는 사용되지되지 않으며, 제거하지 않을 - 다른 답변에도 불구하고.
주제가 Python 개발 목록에 올라갈 때마다 어느 것이 더 나은지에 대한 강력한 논란이 있지만 고전적인 방법을 제거할지 여부에 대한 논란은 없습니다. PEP 3101에 표시 되었음에도 불구하고 Python 3.1은 왔다가 사라졌고 %서식은 여전히 ​​존재합니다.

클래식 스타일을 유지하는 것에 대한 진술은 명확합니다. 간단하고 빠르며 짧은 작업을 위해 빠르게 수행 할 수 있습니다. 이 .format방법을 사용하는 것이 항상 더 읽기 쉬운 것은 아닙니다. 핵심 개발자 사이에서도 .format참조를 보지 않고도에서 제공하는 전체 구문을 사용할 수 있습니다. 2009 년에도 http : // mail 과 같은 메시지가있었습니다 . python.org/pipermail/python-dev/2009-October/092529.html- 주제는 그 이후로 목록에 거의 나타나지 않았습니다.

2016 업데이트

현재 Python 개발 버전 (Python 3.6이 될 예정)에는 PEP-0498 에 설명 된 세 번째 문자열 보간 방법이 있습니다. 새 따옴표 접두사 f""(현재 u"", b""및 제외)를 정의합니다 r"".

문자열을 접두사로 지정하면 f런타임에 문자열 객체에 대한 메서드가 호출되어 현재 범위의 변수를 문자열로 자동 보간합니다.

>>> value = 80
>>> f'The value is {value}.'
'The value is 80.'

3
유형이 자신의 .NET을 구현하도록 허용하는 것이 훨씬 __format__좋습니다. 예를 들어, format(Decimal('0.1'), '.20f')'%.20f' % Decimal('0.1'). 후자는 Decimal을 float로 강제 변환합니다.
Eryk Sun

2
NB. 나는 예전 스타일이 모든면에서 더 낫다고 주장하지 않았습니다. 단지 그것이 더 짧고 때로는 더 읽기 쉽고 (때로는 그렇지 않다는) 것입니다. 확실히 새로운 방법은 훨씬 더 유연합니다.
jsbueno

fPython 3에 이에 상응하는 것이 있습니까?
Daniel

f-strings위의 사용은 파이썬 3.6로 언어의 새로운 기능입니다. 이전 버전에는 존재하지 않으며 구문 오류가 발생합니다.
jsbueno

20

이에 대한 Guido의 최근 입장은 여기에 표시되는 것 같습니다.

Python 3.0의 새로운 기능

PEP 3101 : 문자열 형식화에 대한 새로운 접근 방식

내장 문자열 형식화 작업을위한 새로운 시스템이 % 문자열 형식화 연산자를 대체합니다. (그러나 % 연산자는 여전히 지원됩니다. Python 3.1에서는 더 이상 사용되지 않으며 나중에 언어에서 제거됩니다.) 전체 내용은 PEP 3101을 읽어보십시오.

그리고 마지막으로 수정 된 PEP3101 자체는 (2011 년 9 월 30 일 (금))로 거슬러 올라갑니다. 그래서 그에 대한 늦게 진전이없는 것 같습니다.


18

이전 Python 문서와 PEP 3101을 살펴보면 % 연산자가 향후 언어에서 더 이상 사용되지 않고 제거된다는 진술이있었습니다. 다음 문은 파이썬 3.0, 3.1, 3.2에 대한 파이썬 문서에 있었다 :

str.format ()은 아주 새롭기 때문에 많은 파이썬 코드는 여전히 % 연산자를 사용합니다. 그러나이 이전 형식의 형식은 결국 언어에서 제거되므로 일반적으로 str.format ()을 사용해야합니다.

Python 3.3 및 3.4 문서 의 동일한 섹션 으로 이동하면 해당 문이 제거 된 것을 볼 수 있습니다. 또한 문서에서 연산자가 더 이상 사용되지 않거나 언어에서 제거 될 것임을 나타내는 다른 문을 찾을 수 없습니다. PEP3101 은 2 년 반 이상 (2011 년 9 월 30 일 금요일)에 수정되지 않았다는 점도 중요합니다 .

최신 정보

PEP461 바이트 및 바이트 배열에 % 형식화를 추가하는 것은 허용되며 Python 3.5 또는 3.6의 일부 여야합니다. % 연산자가 살아 있고 발로 차고 있다는 또 다른 신호입니다.

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