파이썬은 적어도 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
. 그래서 이것은 정말로 더 이상 사용되지 않을까요? 이 게시물도 꽤 오래되어 정보가 오래되었을 수 있습니다.
또한보십시오
답변
문서에는 .format
및 f- 문자열이 문자열보다 우수하다는 다양한 표시가 있지만 %
, 후자를 폐기 할 계획은 아직 없습니다.
커밋 이슈 # 14123 : 이전 스타일의 % 문자열 형식에는주의 사항이 있지만 곧 사라지지 않을 것이라고 명시 적으로 언급합니다. , in issue에서 영감을 얻음 현재 printf 스타일 형식을 폐기 할 계획이 없음을 나타내십시오 . %
-formatting에 대한 문서 는 다음 문구를 포함하도록 편집되었습니다.
새로운 문자열 형식 지정 구문이 더 유연하고 튜플과 사전을 자연스럽게 처리하므로 새 코드에 권장됩니다. 그러나 현재 printf 스타일 형식 지정을 중단 할 계획은 없습니다 .
(강조 광산.)
이 문구는 나중에 커밋 Close # 4966 에서 제거되었습니다 : 최신 Python의 상태를 더 잘 설명하기 위해 시퀀스 문서를 수정했습니다 . 이것은 %
포맷 을 폐기하려는 계획 이 카드에 다시 등장했다는 신호처럼 보일 수 있지만 버그 추적기를 살펴보면 의도가 반대임을 알 수 있습니다. 버그 추적기에서 커밋 작성자는 다음 과 같이 변경 사항을 특성화합니다 .
- printf 스타일 형식과 str.format 메서드 사이의 관계를 설명하는 산문을 변경했습니다 (전자가 사라질 위험이 있다는 의미를 고의적으로 제거합니다. 우리가 그것을 죽이는 것을 진지하게 고려하는 것은 단순히 실용적이지 않습니다)
즉, 제거는 말할 것도없고 더 이상 사용되지 않을 것임을 명시 적으로 강조%
하기 위해 -formatting 문서 에 대해 두 번의 연속 변경 사항이 있습니다. 문서는 다른 종류의 문자열 형식화의 상대적인 장점에 대해 의견이 있지만 -formatting이 더 이상 사용되지 않거나 제거되지 않을 것임을 분명히합니다 .%
또한 2017 년 3 월 에 해당 단락에 대한 가장 최근의 변경 사항으로 인해 변경 되었습니다.
여기에 설명 된 형식 지정 작업은 여러 가지 일반적인 오류 (예 : 튜플 및 사전을 올바르게 표시하지 못함)로 이어지는 다양한 단점을 나타냅니다. 최신 형식의 문자열 리터럴 또는
str.format
인터페이스를 사용하면 이러한 오류를 방지하는 데 도움이됩니다. 이러한 대안은 텍스트 서식 지정에 대해보다 강력하고 유연하며 확장 가능한 접근 방식을 제공합니다.
… 이에:
여기에 설명 된 형식 지정 작업은 여러 가지 일반적인 오류 (예 : 튜플 및 사전을 올바르게 표시하지 못함)로 이어지는 다양한 단점을 나타냅니다. 새로운 형식의 문자열 리터럴,
str.format
인터페이스 또는 템플릿 문자열을 사용하면 이러한 오류를 방지하는 데 도움이 될 수 있습니다. 이러한 각 대안은 단순성, 유연성 및 / 또는 확장 성이라는 고유 한 장단점과 이점을 제공합니다.
“피하는 데 도움이 됨”에서 “피하는 데 도움이 될 수 있음”으로의 변경 사항과 .format
각 스타일이 “자신의 장단점과 이점을 제공” 하는 방법에 대한 푹신하고 모호한 산문으로 명확한 권장 사항 과 f- 문자열이 어떻게 대체되었는지 확인하십시오 . 즉, 공식적인 지원 중단이 더 이상 카드에 표시되지 않을뿐만 아니라 현재 문서는 %
형식이 다른 접근 방식에 비해 “장점”이 있음을 공개적으로 인정하고 있습니다.
나는이 모든 것으로부터 %
서식 을 비난하거나 제거하려는 움직임 이 흔들 렸을뿐만 아니라 철저하고 영구적으로 패배 했다고 추론 합니다.
답변
새로운 .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()
리터럴을 사용할 수 있는 곳이 아닌 곳에서 사용해야합니다.
답변
%
문자열 형식에 대한 연산자는 사용되지되지 않으며, 제거하지 않을 – 다른 답변에도 불구하고.
주제가 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.'
답변
이에 대한 Guido의 최근 입장은 여기에 표시되는 것 같습니다.
PEP 3101 : 문자열 형식화에 대한 새로운 접근 방식
내장 문자열 형식화 작업을위한 새로운 시스템이 % 문자열 형식화 연산자를 대체합니다. (그러나 % 연산자는 여전히 지원됩니다. Python 3.1에서는 더 이상 사용되지 않으며 나중에 언어에서 제거됩니다.) 전체 내용은 PEP 3101을 읽어보십시오.
그리고 마지막으로 수정 된 PEP3101 자체는 (2011 년 9 월 30 일 (금))로 거슬러 올라갑니다. 그래서 그에 대한 늦게 진전이없는 것 같습니다.
답변
이전 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의 일부 여야합니다. % 연산자가 살아 있고 발로 차고 있다는 또 다른 신호입니다.