tldr이없는 이유;format
은 obj.__format__
을 호출하고 더 높은 수준의 항목을 수행하는 str.format
메서드에서 사용됩니다. 낮은 레벨의 경우에는 객체에 형식을 지정하는 방법을 가르치는 것이 좋습니다.
그냥 문법 설탕에게 있습니다
이 기능이 str.format
에 이름과 형식 사양은 오해의 소지가 할 수있는 공유는 사실. str.format
의 존재는 설명하기 쉽습니다. 복잡한 문자열 보간을 수행합니다 (이전 %
연산자 대체). format
은 단일 객체를 문자열로 지정할 수 있습니다. 가장 작은 하위 집합은 str.format
입니다. 그렇다면 왜 format
이 필요할까요?
format
기능은 일부 OO 언어에있는 obj.format('fmt')
구조의 대안입니다. 이 결정은 len
의 이유와 일치합니다 (파이썬이 x.length
Javascript 또는 Ruby와 같은 속성 대신에 len(x)
함수를 사용하는 이유와 일치 함). 언어는 obj.format('fmt')
구조를 채택
(또는 obj.length
, obj.toString
등)를, 클래스 속성이 format
으로 호출 방지 할 수있다 (또는 length
을 toString
을, 당신은 생각이있어) - 그렇지 않으면에서 표준 방법을 그림자 것 언어. 이 경우 언어 디자이너는 이름 충돌을 방지하기 위해 프로그래머에게 부담을주고 있습니다.
파이썬은 PoLA 매우 좋아하고 사용자 정의 속성과 언어 내장 기능 간의 충돌의 가능성을 최소화하기 위해 내장 된 기능에 대한 __dunder__
(이중 밑줄) 규칙을 채택했다. 따라서 obj.format('fmt')
은 obj.__format__('fmt')
이되고 물론 format(obj, 'fmt')
대신 obj.__format__('fmt')
을 호출 할 수 있습니다 (len(obj)
대신 obj.__len__()
과 같은 방식으로 호출 할 수 있음). 깨끗하고 입력하기가 쉽습니다 하나
>>> '{0:x}'.format(13)
'd'
>>> (13).__format__('x')
'd'
>>> format(13, 'x')
'd'
:
귀하의 예제를 사용하십니까?파이썬 디자인은 매우 실용적이지만 클리너는 아니지만 OO에 대한 파이썬의 duck-typed 접근 방식과 잘 부합되며 레거시 코드를 손상시키지 않고 기본 구현을 변경/확장 할 수있는 자유를 언어 설계자에게 제공합니다.
PEP 3101
는 새로운
str.format
방법
format
을 도입
format
기능에 대한 근거에 어떤 코멘트없이 내장,하지만 구현은 분명히 단지
syntactic sugar입니다 :
def format(value, format_spec):
return value.__format__(format_spec)
그리고 여기에 내가 내 경우를 휴식. 귀도 그것에 대해 말했다 무엇
인용 매우 BDFL 약 len
(또는 공식이다는?) : 나중에 많이 와서 모든
첫째, 나는 HCI 이유 x.len()
이상 len(x)
를 선택 (def __len__()
). 두 개의 고리로 연결되었다는 이유는, 실제로이 둘 HCI :
(가) 일부 작업의 경우, 접두사 표기법 그냥 접미사보다 더 읽기 - 접두사 작업이 영상은 도움이 표기법을 좋아하는 수학에 오랜 전통을 가지고 (그리고 중위!) 수학자는 문제에 대해 생각합니다. 우리가 x*(a+b)
과 같은 수식을 x*a + x*b
으로 다시 작성하는 것의 쉬운 점을 원시 OO 표기법을 사용하여 같은 일을하는 것의 어색함과 비교하십시오.
(b) 내가 len(x)
이라는 코드를 읽을 때 뭔가의 길이를 요구한다는 것을 알고 있습니다. 이것은 두 가지를 말해줍니다. 결과는 정수이고, 인수는 일종의 컨테이너입니다. 반대로, 내가 x.len()
을 읽을 때, 나는 이미 x
이 인터페이스를 구현하거나 표준 len()
을 가진 클래스로부터 상속받은 어떤 종류의 컨테이너라는 것을 알아야합니다. 매핑을 구현하지 않는 클래스가 get()
또는 keys()
메쏘드를 가지고 있거나 파일이 아닌 무언가가 write()
메쏘드 일 때 때때로 우리가 혼란스러워하는 것을 목격하십시오.
동일한 의미로 다른 말로하면 'len
'이 기본 제공 작업으로 표시됩니다. 나는 그것을 잃는 것을 싫어한다./.../
소스 : [email protected] (here도 귀도가 응답 된 원래의 질문을 가지고 원래의 게시물). Abarnert 또한 제안하십시오 Design and History FAQ에서 렌에 대한 추가 추론이있다
. 그것이 완전하거나 답이 좋지는 않지만 논쟁의 여지가없는 공식입니다. - abarnert
이 실제 우려하거나 구문 하찮은 일에 속 태우고인가?
동적 유형 지정 언어에서 변경 가능한 객체가 실제로 네임 스페이스이고 개인 메서드 또는 속성의 개념이 규칙 상 문제이므로 Python, Ruby 또는 Javascript와 같은 언어에서 매우 실용적이고 실제적인 관심사입니다.아마도 나는 그의 의견에에게보다 나은 abarnert 골로 연결되지 못했습니다 :
을 또한, 지금까지의 루비와 JS와 네임 스페이스 오염 문제로,이는 동적으로 입력 된 언어와 고유의 문제가 있음을 지적 가치가있다. Haskell 및 C++과 같이 다양한 정적 유형 언어에서 유형별 자유 함수는 가능할뿐만 아니라 관용적입니다. (The Interface Principle을 참고하십시오.) 그러나 Ruby, JS, Python과 같은 동적 유형 언어에서는 자유 함수가 보편적이어야합니다. 동적 언어에 대한 언어/라이브러리 디자인의 큰 부분은 이러한 기능을 올바르게 선택하는 것입니다.
예를 들어, 난 그냥 Angular.jsI was tired of namespace conflicts in Ember 때문에 찬성 Ember.js을 왼쪽으로 Angular는 내장 Python과 같은 밑줄 대신에 $thing
을 Angular로 접두어로 붙이는 우아한 Python과 같은 전략을 사용하므로 사용자 정의 메서드 및 속성과 충돌하지 않습니다. 그렇습니다. 전체적으로 __thing__
은 그리 좋지는 않지만, 매우 명확하고 객체 네임 스페이스 충돌과 관련하여 버그 클래스 인 PoLA을 피하기 때문에 Python이이 접근법을 사용하게 된 것을 기쁘게 생각합니다.
어쨌든'format()'이'.format()'보다 선호된다고 처음 들었습니다. 형식 문자열 사양에 대한 문서에서도 처음부터'.format()'을 사용합니다.이 포맷을 어디에서 얻고 있습니까? – Amber
@Amber 여기에 대한 답을 보면 그렇습니다. 항상 그렇습니다. – jamylak
예가 있습니까? – Amber