문제

이 질문은 꽤 오랫동안 나를 괴롭 혔습니다 ( 나의 이전 질문) : 왜 정확히 print(x) 더 낫다 (더 피스닉으로 정의 됨) print x?

모르는 사람들을 위해 print Python 3.0에서 진술이 기능으로 변경되었습니다. 공식 문서가 있습니다 PEP 3105 그리고 동기 부여가 있습니다 Guido van Rossum의 이메일.

그 지점들에 반대 지점을 만들고 싶습니다.

  1. 다른 운영자가 있습니다 import 기능은 실제로 기능으로 복제되어 있지만 우리는 진술로 씁니다. __import__
    • 초보자, 운영자에게 print 일반적인 응용 프로그램 논리에 속하지 않습니다. 그들에게 그것은 그들의 프로그램의 정점 인 신비한 운영자입니다. 그들은 다르게 보일 것으로 기대합니다.
    • 기본 Python 2.X를 설명하는 모든 초보자 책은 이제 첫 번째 예에서 깨진 것이 보장됩니다. 확실히, 언어는 때때로 변화하지만, 이러한 변화는 일반적으로 초보자에게는 덜 눈에 띄지 않습니다.
    • 기능이 print 응용 프로그램 수준에서 복제 할 수 있습니다. 예를 들어, 때로는 콘솔에서 인쇄를 모달 OS 대화 상자로 리디렉션하고 싶습니다.
    • 사람들은 모두 다시 쓰기가 어렵다고 말합니다 print 함수에 대한 진술은 모든 Python 2.X 개발자가 모든 프로젝트에 대해 정확히이를 수행하도록 강요했습니다. 좋습니다. 자동 변환기는 어렵지 않습니다.
    • 기능을 조작 할 수있는 능력을 즐기는 모든 사람 print 만약 잘 보증 될 것입니다 print 진술 랩핑 함수였습니다 __print__.

그렇다면 스택 오버플로 페이지 에이 질문에 대한 정식 답변을받을 수 있습니까?

도움이 되었습니까?

해결책

당신의 것 같아서 질문이 아닌 토론입니다. 당신은 당신이 당신의 주장에 얼마나 깊고 잘못되었는지를 보여주는 답을 받아 들일 것입니까?!

토론 지점에 :

우리가 진술로 작성하는 가져 오기와 같은 다른 운영자가 있지만, 기능은 실제로 기능으로 복제되어 있습니다. __import__

절대적으로 잘못 : 기능 __import__ (처럼 모든 기타 기능 - 및 연산자, 그 문제에 대해) 바인딩 아니요 "발신자"(포함 된 코드)의 범위에있는 이름 - "발신자의 범위"에서 이름을 바인딩하는 "Thingie" ~ 해야 하다 진술이 되십시오 (과제와 마찬가지로 def, 그리고 call). 당신의 "포인트" 싫어함 이 차이점이지만 묵살 가장 분명히 단순히 잘못입니다.

Python 문장은 Python 컴파일러가 구체적으로 알고 있어야하는 것입니다. 이름의 바인딩을 변경하고 제어 흐름을 변경할 수 있으며/하거나 특정 조건에서 생성 된 바이트 코드에서 완전히 제거해야 할 수도 있습니다 (후자는 assert). print was the Python 2 에서이 주장에 대한 예외; Python 3은 진술 명단에서 그것을 제거함으로써 예외를 제거하고 일반적인 주장을 "그냥 유지"하므로보다 일반적인 언어입니다. 특별한 경우는 규칙을 위반할만큼 특별하지 않습니다. 오랫동안 Pythonic 교리였습니다 (do import this 대화식 통역사에서 >>> "Python의 선"이 표시되는 것을 프롬프트하고, 언어로의 이러한 변화는 초기의 잘못된 설계 결정으로 인해 수년 동안 남아 있어야하는이 교리의 위반을 제거합니다.

초보자에게는 운영자 인쇄가 일반 응용 프로그램 논리에 속하지 않습니다. 그들에게 그것은 그들의 프로그램의 정점 인 신비한 운영자입니다. 그들은 다르게 보일 것으로 기대합니다.

실행 가능한 일찍 오해의 초보자를 치료하는 것은 매우 좋은 일입니다.

기본 Python 2.X를 설명하는 모든 초보자 책은 이제 주먹 예에서 깨진 것으로 보장됩니다. 확실히, 언어는 때때로 변화하지만, 변화는 일반적으로 초보자에게는 덜 눈에 띄지 않습니다.

언어는 깊고 거꾸로 호환되지 않는 방식으로 거의 변하지 않으며 (Python은 10 년 정도 약 1 년 동안) "초보자에게는 눈에 잘 띄는"언어 기능이 거의 없으므로 총 관찰 수는 적지 만 작은 나침반 내에서도 쉽게 할 수 있습니다. 초보자가 눈에 잘 띄는 기능이 너무 심하게 설계되어 혼란의 가치가있는 카운터 샘플을 찾으십시오. 예를 들어, Microsoft의 Visual Basic과 같은 최신 기본 방언은 명시 적 사용자 입장선 번호를 사용하지 않습니다. 기본의 초기 방언에서 필수이기 때문에 모든 사람이 끔찍하고 눈에 잘 띄는 "기능"입니다. LISP의 현대적인 변형 (체계 이후)은 Dynamic Scoping을 사용하지 않으며, 슬프게도 눈에 잘 띄는 오해 (일반적으로 코드에서 이해하기 어려운 버그로 나타냄), 기본적으로 LISP에서 기능을 작성하기 시작하자마자 초보자에게 1.5 (나는 한때 그 중 초보자였으며 얼마나 나쁘게 물린 것을 증언 할 수 있습니다).

인쇄 기능이 응용 프로그램 수준에서 복제 될 수 있다는 것은 즉시 분명하지 않습니다. 예를 들어, 때로는 콘솔에서 인쇄를 모달 OS 대화 상자로 리디렉션하고 싶습니다.

이 "포인트"를 따르는 확실하지 않습니다. 그냥 변경하십시오 sys.stdout 좋아하는 의사 파일 물체에 마음의 내용물로 리디렉션합니다. 옵션 내장 기능을 패치하는 원숭이의 print (Python 2에서는 한 번도 없었던 것), 아무도 팔을 비틀고 그렇게하도록 강요하지 않습니다.

사람들은 모든 인쇄문을 함수에 다시 작성하기가 어렵다고 말하지만 모든 Python 2.X 개발자가 모든 프로젝트에 대해 정확하게 그렇게하도록 강요했습니다. 좋습니다. 자동 변환기는 어렵지 않습니다.

그만큼 2to3 도구는 실제로 이러한 쉬운 표면 비 호환성을 처리합니다. 땀이 나지 않습니다. print, 사람들은 그것을 광범위하게 사용합니다). 그래서, 당신의 "포인트"는 무엇입니까?

인쇄물 인쇄를 조작 할 수있는 능력을 즐기는 사람은 인쇄물이 성명서 랩핑 함수라면 잘 보존 될 것입니다. 인쇄.

그러한 배열은 그 자체로 불필요한 키워드를 제거하지 않을 것입니다. 불규칙, 위에서 설명한대로 : 아니요 좋은 이유 ~이다 컴파일러가 어떤 식 으로든, 형태 또는 형태로 그것을 특별히 인식 할 필요가 없기 때문에 진술. 그러한 근본적인 기능을 갖는 것은 실제 가치를 더할 것이라는 것이 분명하지만, 실제 사용 사례가 있다면 Python Ideas 메일 링리스트에서 사건을 확실히 제안 할 수 있습니다. ,, 개조 할 수있다 print Python 2.7의 진술뿐만 아니라 print 파이썬에서 기능 3.2.

그러나 내장을 원숭이 패치하고 싶은 일반적인 사례를 고려하십시오. print: 멋진 조정을 허용하는 키워드 인수 추가. 어떻게 __print__ 당신은 분명히 제안 된 기능 KW 주장을 __print__ 성명? 공포보다 아직 펑키 한 구문 >> myfile 그리고 후행 쉼표 ...?! 와 함께 print 함수로서 키워드 인수는 적용되는 완벽하게 정상적이고 일반적인 규칙을 따릅니다. 모든 기능 및 기능 호출 - 행복!

요약하면 print 변칙, 특별한 경우 및 이상한 예외적 인 구문에 대한 필요성을 제거하기 때문에 기능이되기 위해서는 단순성, 규칙 성 및 균일 성이 Python의 상표입니다.

다른 팁

다음은 2.x의 인쇄문을 싫어하는 이유입니다.

>>> something()
<something instance at 0xdeadbeef>
>>> print something()
<something instance at 0xdeadbeef>

무가치 한 물체는 유용하지 않습니다 __str__, 좋아, 나는 다룰 수있다, 좀 더 볼 수있다.

>>> dir(something())
['foo', 'bar', 'baz', 'wonderful']
>>> help(something().foo)
"foo(self, callable)"

흠 .. 그렇게 부름 가능한 주장이 있습니까?

>>> something().foo(print)
    something().foo(print)
                        ^
SyntaxError: invalid syntax
>>> something().foo(lambda *args: print(*args))
    something().foo(lambda *args: print(*args))
                                      ^
SyntaxError: invalid syntax

그래서 ... 나는 사용할 함수를 정의해야한다

>>> def myPrint(*args): print *args
    def myPrint(*args): print *args
                              ^
SyntaxError: invalid syntax
>>> def myPrint(*args): print args
...
>>> myPrint(1)
(1,)

Shudder 또는 사용 sys.stdout.write, 그것은 거의 다른 행동을 가지고 있기 때문에 거의 cludgy입니다. print. 또한 외모 다르게, 나는 그것이 존재한다는 것을 거의 기억하지 못할 것입니다.

사용 print 짧은 일회성 유형의 시설의 진술은 로깅이나 더 나은 것을 사용하도록 개선하는 것이 불가피합니다. 인쇄물이 그런 것들처럼 작동하고 특히 고차 기능으로 사용될 수 있다면 사용하지 않을 때 사용하는 것보다 낫습니다. 진짜 로깅 또는 진짜 디버거.

그만큼 print 성명서는 또한 비정상적인 것을 가지고 있습니다 >> 특정 파일로 인쇄하기위한 구문. 파이썬에는이 구문이있는 다른 진술이 없으므로 그런 식으로 드문 일입니다.

그래도 당신이 옳다고 믿습니다. 대부분의 문제는 print 성명서는 __print__ 기능.

GVR의 "Print는 그것에 전념하는 진술이있는 유일한 응용 프로그램 수준 기능"을 설득했습니다. Python은 일반 목적 언어이며 연산자 또는 키워드로 스트림에 출력 할 수있는 진술이 없어야합니다.

구문이 다음과 같아야하기 때문에 Pythonic이 아닙니다.

stdout.append("Hello World")

또는

stdout += "hello world"

면책 조항 : 나는 Python을 정말 좋아합니다.

진지한 메모로 ...

속성 가시성과 같은 것들에 대한 Python의 객체 모델과 '직접 구현'접근 방식이 훌륭하다고 생각합니다. 나는이 '모든 것이 객체'접근법이라고 생각하며, 객체 구조의 모음으로 정의 된 객체조차도 매우 명확하다고 생각합니다.

내가 Python이 할까봐 두려워하는 것은 그것이 명확한 방식으로 의도를 제시하지 않는 언어가되는 것입니다 ... 그리고 나는 이미 비 전통적인 구문 프레젠테이션을 지나치게 생각하는 데 원칙의 아름다움이 쇠약 해지는 것을 싫어합니다. 일종의 좋아요 LISP, 구조가 아름답고, 멍청하고, 구문의 IMHO.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top