파이썬의 단점은 무엇입니까? [닫은]


147

파이썬은 요즘의 모든 분노처럼 보이지만 과감히 아닙니다. 왜냐하면 그것은 진정으로 해결해야 할 새로운 문제가 주어진 언어이기 때문입니다. 그러나 현명한 사람이 한 번 말했듯이 ( 실제로 누가 말했는지에 대해 전혀 몰랐기 때문에 그를 현명한 사람 이라고 부릅니다. 그가 전혀 현명한 지 확실하지 않습니다) 구문, 디자인 등의 장점과 단점도 있습니다. 완벽한 언어는없고 어떤 언어는 다른 언어보다 낫습니다.

따라서 파이썬의 객관적인 단점은 무엇입니까?

참고 : 여기서 언어 비교를 요구하지 않습니다 (예 : C #이 Python보다 낫습니다. 일부는 누락되었습니다. 다른 언어를 비교로 사용해야하지만 다른 방법으로는 자세히 설명하기 어려운 요점 만 설명하는 경우 (예 : 이해하기 쉽도록)


50
나는 이것이 유용한 주관적인 질문이라고 생각하며 그것을 닫는 것은 부끄러운 일입니다.
Eric Wilson

25
여기에 모든 파이썬 방지 답변을 하향 투표하는 파이썬 팬보이가있는 것 같습니다.
zvrba

2
@TMN : 여전히 공백을 토큰으로 취급하고 있지만 반환하지 않고 파이썬의 문법도 마찬가지입니다.

9
@Roger : SO의 관례는 downvotes를 언급하는 것입니다. 이 사이트는 주관적인 의견을 제시 하는 사이트이므로 다운 보트에 대한 이유는 없습니다. 코멘트가 없습니다. 그래서 나는 "이름 부르는"옆에 서 있습니다.
zvrba

8
@zvrba : Downvotes는 항상 그렇듯이 "유용하지 않음"을 의미합니다.

답변:


109

나는 다소 정기적으로 파이썬을 사용하고 전반적으로 나는 그것을 아주 좋은 언어라고 생각합니다. 그럼에도 불구하고 완벽한 언어는 없습니다. 개인적으로 나에게 중요한 순서 단점은 다음과 같습니다.

  1. 느리다. 정말, 정말 느리다는 것을 의미합니다. 많은 경우 이것이 중요하지 않지만, 성능에 중요한 부분을 위해서는 다른 언어가 필요하다는 것을 의미합니다.

  2. 중첩 함수는 외부 범위에서 변수를 수정할 수 없다는 점에서 짜증납니다. 편집 : 여전히 라이브러리 지원으로 인해 Python 2를 사용 하며이 디자인 결함으로 인해 나에게 자극을 주지만 분명히 로컬아닌 명령문 으로 인해 Python 3에서 수정되었습니다 . 내가 사용하는 라이브러리가 이식 될 때까지 기다릴 수 없으므로이 결함은 역사의 재 더미로 보내질 수 있습니다.

  3. 라이브러리 / 일반 코드에 유용 할 수있는 몇 가지 기능이 누락되었으며 IMHO는 건강에 해로운 극단으로 단순 해졌습니다. 내가 생각할 수있는 가장 중요한 것은 사용자 정의 값 유형 (이것은 메타 클래스 마술로 만들 수 있지만 추측 한 적이 없다고 생각 함) 및 ref 함수 매개 변수입니다.

  4. 금속과는 거리가 멀다. 스레딩 프리미티브 또는 커널 코드 등을 작성해야합니까? 행운을 빕니다.

  5. 파이썬이 제공하는 역동성에 대한 트레이드 오프로서 의미 론적 오류를 미리 파악할 수있는 능력이 부족하다고 생각하지는 않지만 , 실제로 코드를 실행하지 않고도 구문 오류와 잘못된 변수 이름과 같은 어리석은 것들을 포착 할 수있는 방법이 있었으면합니다.

  6. 이 문서는 강력한 회사 지원을받는 PHP 및 Java와 같은 언어만큼 좋지 않습니다.


60
@Casey, 나는 동의하지 않는다. 색인이 끔찍합니다. with문이나 메소드를 찾아보십시오 list. 튜토리얼에서 다루는 내용은 기본적으로 검색 할 수 없습니다. C ++에 대한 Microsoft의 설명서가 훨씬 좋습니다.
Mark Ransom

17
약 5-단지 pyflakes를 사용하십시오. 이러한 오류를 정확하게 포착하기 위해 작성되었습니다.
Alexander Solovyov

4
속도에 관해서 : PyPy의 등장으로 많은 Python 사용자는 이제 JIT 컴파일러가 내장 된 인터프리터를 사용하여 속도 문제를 처리 할 수 ​​있습니다 (현재 Python 3 사용자와 cpyext가 처리하지 않는 C 확장 모듈 사용자) 이 옵션이 없습니다).
ncoghlan

29
파이썬 문서를 멸시합니다. 그것들은 대부분의 것보다 더 예쁘지 만, 많은 유용한 정보가 문자열과리스트의 메소드와 같이 한 페이지에 집중되어 있으며 모든 시퀀스 유형도 함께 집중되어 있습니다. 이 정보를 검색 할 때, 나는 단지 거대한 주제에 착륙했고, 원하는 것을 찾기 위해 페이지를 검색해야합니다. 또한이 페이지의 색인을 읽기 어려우며, 원하는 섹션을 말하기가 어려운 경우가 있습니다.
카슨 마이어스

5
금속으로부터의 거리가 어떻게 논쟁이 될 수 있습니까? 파이썬은 스스로 시스템 언어가 되었습니까?
Mark Canlas

66

나는 파이썬이 변수의 선언과 사용법을 구별 할 수 없다는 것을 싫어합니다. 정적 타이핑이 필요하지 않습니다. “이것은 의도적으로 선언하는 변수이며 새로운 이름을 소개 하려고 하는데 이것은 오타가 아닙니다.” 라고 말하는 방법을 갖는 것이 좋을 것 입니다.

또한, 나는 보통 한 번 쓰기 스타일로 파이썬 변수를 사용합니다. 목록 이해와 같은 기능 덕분에 실제로 이것은 매우 쉽고 코드 흐름을 더 쉽게 따라갈 수 있습니다.

그러나 나는 그 사실을 문서화 할 수 없습니다. 파이썬에서 아무것도 덮어 쓰거나 변수를 재사용하는 것을 막을 수 없습니다.

요약하면, 언어로 된 두 개의 키워드를 갖고 싶습니다 : varlet. 둘 중 하나에 의해 선언되지 않은 변수에 쓰면 파이썬에서 오류가 발생합니다. 또한 변수는 "정상" let인 반면 변수를 읽기 전용으로 선언합니다 var.

이 예제를 고려하십시오.

x = 42    # Error: Variable `x` undeclared

var x = 1 # OK: Declares `x` and assigns a value.
x = 42    # OK: `x` is declared and mutable.

var x = 2 # Error: Redeclaration of existing variable `x`

let y     # Error: Declaration of read-only variable `y` without value
let y = 5 # OK: Declares `y` as read-only and assigns a value.

y = 23    # Error: Variable `y` is read-only

유형은 여전히 ​​암시 적입니다 (그러나 let변수는 새 값으로 리 바인드 될 수없고 var변수는 여전히 동적으로 유형화 될 수 있으므로 모든 의도 및 목적은 정적 으로 유형화 됨).

마지막으로 모든 메소드 인수는 자동으로 let즉, 읽기 전용이어야합니다. 일반적으로 다음 관용구를 제외하고 매개 변수를 수정해야 할 이유는 없습니다.

def foo(bar = None):
    if bar == None: bar = [1, 2, 3]

이것은 약간 다른 관용구로 대체 될 수 있습니다.

def foo(bar = None):
    let mybar = bar or [1, 2, 3]

6
파이썬에 "var"문장이 있었으면 좋겠습니다. 당신이 말한 (아주 좋은) 이유 외에도 코드를 읽는 것이 훨씬 쉬워집니다. 왜냐하면 페이지를 스캔하여 모든 변수 선언을 발견 할 수 있기 때문입니다.
jhocking

25
마치 파이썬 개발자가 과거의 교훈을 무시한 것처럼 보입니다. 함수를 선언하지 않고 변수를 선언하지 않는 것은 1950 년대에 처음 만들어진 실수입니다. 발견하기 어려운 오타로 인한 버그를 찾기 어려운 사람들은 1950 년대에 처음으로 놀랍도록 충분했습니다. 이 언어 실수는 몇 번이고 다시 수정되었습니다. 변수 선언은 큰 부담이 아닙니다. 내 엉덩이를 여러 번 저장했습니다. 나는 필연적 use strict;use warnings;모든 규모의 스크립트에 펄있다. 파이썬은 개발자에게 너무 많은 디버깅 보조 도구를 제거했습니다.
David Hammen

19
@David, 파이썬에 공평하게 할당되지 않은 변수에 액세스하려고하면 예외가 발생합니다. 선언이없는 많은 언어는 일종의 기본값을 반환합니다. 결과적으로 파이썬 버전은 그 버전보다 훨씬 덜 문제가됩니다.
Winston Ewert

1
@yi_H이 제안은 이전 버전과 호환되거나 실제 제안이 아닙니다. 문제는 가지고 있지, 잘 ... "무슨 일이 파이썬의 단점이다"이었다 varlet(또는 유사한 메커니즘) 단점이다. 다르게 말하면 : 나는 파이썬의 디자이너 였으면 이런 짓을했을 것입니다. , 향후 버전 에는 특수 패키지 (와 유사한 ) 를로드 할 때이를 포함 할 수 있습니다 __future__. 말해봐 import strict. 문법적인 해킹이 필요하기 때문에 이런 일은 일어나지 않을 것입니다…
Konrad Rudolph

3
+1 더 나은 '기능적'프로그래밍 능력을 추가합니다.
Evan Plaice

44

내 주요 불만은 스레딩인데, 이는 전역 인터프리터 잠금으로 인해 많은 상황에서 (Java, C 및 기타와 비교하여) 성능이 좋지 않습니다 ( "Python GIL 내부"(PDF 링크) 대화 참조).

그러나 사용하기 매우 쉬운 다중 프로세스 인터페이스 가 있지만 동일한 수의 프로세스 대 스레드의 메모리 사용량이 많거나 공유 데이터가 많으면 어려울 것입니다. 그러나 여러 프로세스로 작업하는 프로그램이 있으면 스레드 된 프로그램으로는 할 수없는 여러 시스템에 걸쳐 프로그램을 확장 할 수 있다는 이점이 있습니다.

나는 문서의 비판에 정말로 동의하지 않는다. 나는 그것이 모든 주요 언어가 아니라면 대부분보다 우수하다고 생각한다.

또한 pylint를 실행하는 많은 런타임 버그를 잡을 수 있습니다 .


2
pylint의 경우 +1 나는 그것을 몰랐다. 다음에 파이썬으로 프로젝트를 할 때 시도해 볼 것입니다. 또한 참조 CPython 구현 대신 Jython을 사용하면 멀티 스레딩이 제대로 작동하는 것 같습니다. OTOH Jython은 CPython보다 다소 느리므로 목적을 부분적으로 무효화 할 수 있습니다.
dsimcha

3
스레딩이 제대로 지원되지 않습니까? 스레딩 라이브러리는 2.1 이전부터있었습니다.
rox0r

2
스레딩 지원이 있다는 것을 알고 있지만 Java 또는 C에 비해 GIL은 실제로 성능을 저하시킵니다. 이것이 멀티 프로세싱 모듈이 스레딩보다 선호되는 이유입니다.
cmcginty

2
찾을 수 있으면 문서가 좋습니다. 인터넷 검색 Java 클래스는 Python보다 훨씬 쉽습니다.
Brendan Long

@Casey 나는 스레딩이 지원되기 때문에 이상한 성능을 보여줍니다 (참조 및 문서에 대한 링크도 추가됨)
dbr

28

논란의 여지가 있지만 특정 클래스의 런타임 오류 를 유발할 수있는 정적 타이핑 이 없다는 것은 오리 타이핑이 제공하는 유연성의 가치가 없습니다.


5
C / Java와 같은 언어의 컴파일러에서 오류를 확인할 수있는 PyChecker와 같은 도구가 있지만 이는 올바른 것입니다.
Oliver Weiler

24
동적 타이핑은 의도적 인 디자인 결정이며 단점이 아닙니다.
missingfaktor

14
Java의 약점은 동적 타이핑이 없다고 말하는 것과 같습니다.
MAK

12
@missingfaktor, @MAK, 분명히 오리 타이핑은 의도 된 기능이었습니다. 그러나 대부분의 설계 결정에는 객관적인 이점과 단점이 있습니다. 추가 된 코드 유연성은 동적 타이핑의 이점이며 잠재적 인 런타임 오류의 추가 클래스는 단점입니다. 주관적인 부분은 그 기능이 가치가 있는지 여부입니다.
야곱

6
정적 타이핑이 부족하면 프로그래머 가 런타임 오류가있는 코드 를 보다 쉽게 작성할 수 있습니다. C #에서는 int foo = 4; Console.Write(foo.Length);컴파일되지 않으므로 "Int32에 길이 속성이 없습니다"라는 오류가 실수로 게시 된 소프트웨어로 들어갈 수 없습니다. 파이썬에서 선택적 보조 도구를 실행하여 이와 같은 오류를 찾지 않으면 존재하지 않는 객체 멤버에 액세스하는 코드가 런타임 오류를 일으킬 때까지 감지되지 않을 수 있습니다.
Jacob

27

파이썬의 객체 지향 부분은 일종의 "볼트"된 느낌이 듭니다. 모든 방법에 "자체"를 명시 적으로 전달해야하는 것은 OOP 구성 요소가 명시 적으로 계획 되지 않은 증상입니다 . 또한 다른 답변에서 비판을받은 파이썬의 때로는 스코프 규칙을 보여줍니다.

편집하다:

파이썬의 객체 지향 부분이 "볼트"되었다고 말할 때, OOP 쪽이 다소 일관성이 없다고 생각합니다. Ruby를 예로 들어 보겠습니다. Ruby에서는 모든 것이 객체이므로 익숙한 obj.method구문을 사용하여 메서드를 호출 합니다 (물론 오버로드 된 연산자는 제외). 파이썬에서는 모든 것이 객체이지만 함수로 호출하는 메소드도 있습니다. 즉, 오버로드 __len__하여 길이를 반환하지만 다른 언어에서 len(obj)보다 친숙하고 일관된 대신에 호출하여 호출합니다 obj.length. 이 디자인 결정 뒤에는 이유가 있지만, 마음에 들지 않습니다.

또한 Python의 OOP 모델에는 데이터 보호가 부족합니다. 즉, 개인, 보호 및 공개 구성원이 없습니다. 메소드를 사용 _하거나 __메소드 앞에서 모방 할 수 있지만, 추악합니다. 마찬가지로, 파이썬은하지 않습니다 아주 중, OOP의 권리의 메시지 전달 측면을 얻는다.


17
self 매개 변수는 다른 언어가 암시 적으로 남겨둔 것을 명시 적으로 만듭니다 . 이러한 언어에는 "self"매개 변수가 있습니다.

13
@Roger Pate : 그렇습니다. 그러나 "자기"에 대한 그 명시적인 필요성은 일종의 성가신 일입니다. 또한 의도적 인 디자인 결정으로 나오지 않았지만 파이썬의 "이상한"범위 지정 규칙으로 인해 발생했습니다. 기사를 빨리 찾을 수 없지만 Guido van Rossum의 "post"매개 변수가 필요한 이유를 잘 설명하는 이메일이 게시되어 있습니다.
mipadi

2
@Roger Pate : 객체 지향 언어에서 대상을 첫 번째 매개 변수로 전달하는 것은 여전히 ​​구현 세부 사항으로 간주 될 수 있습니다. 그러나 나의 요지는 그것이 좋은 생각인지 아닌지가 아니다. 요점은 파이썬에서,이 점입니다 하지 의식 디자인 결정에 의한 것이 아니라 범위 지정 시스템에 사마귀를 해결할 수 있습니다.
mipadi

3
@ mipadi : 업데이트는 더 나은 추론을 가지고 있습니다 (따라서 downvote를 제거 할 것입니다).하지만 len 을 오버로드 하는 연산자 로 보면 파이썬에서 더 많은 OO입니다. 파이썬이 메시지 전달을 어떻게 잘못하는지에 대한 예 또는 추론을보고 싶습니다.

8
명시 적 자체는 메소드가 함수일 뿐이라는 사실 (Winston이 암시 한 것처럼 암시 적 로컬 변수 선언)의 결과입니다. 디자인 결정은 마음 에 들지 않지만 런타임에 객체로 액세스 할 수 있는 모든 언어 가 바보 같은 언어로 OOP를 "볼트 온"으로 호출하는 것은 자유 롭습니다 .
ncoghlan

19

내가 파이썬에 대해 싫어하는 것 :

  1. 스레딩 (나는 이미 언급되었지만 모든 게시물에서 언급 할 가치가 있음을 알고 있습니다).
  2. 여러 줄 익명 함수를 지원하지 않습니다 ( lambda표현식은 하나만 포함 할 수 있음).
  3. (같은 간단하지만 강력한 입력 읽기 기능 / 클래스의 부족 cin또는 scanfC ++과 C 또는 Scanner자바).
  4. 모든 문자열은 기본적으로 유니 코드가 아닙니다 (그러나 Python 3에서는 수정되었습니다).

5
(2)에 관해서는 중첩 된 함수를 가질 가능성에 의해 상쇄된다고 생각합니다.
Konrad Rudolph

3
@KonradRudolph 멀티 라인 람다 대신 중첩 함수가있는 주요 주요 내용은 읽기 순서가 바뀌는 것입니다.
CookieOfFortune

2
@wkschwartz : raw_input및 'sys.stdin'은 매우 중요한 요소 입니다. 형식화 된 입력을 지원하지 않습니다 (예 : "% d : % d : % d"% (시간, 분, 초)와 같은 시간 읽기). 지금까지 Python에는 scanf (C) 또는 Scanner (Java)의 기능에 접근하는 것이 없습니다.
MAK

2
@limscoder : 모든 문자열은 기본적으로 Java에서 유니 코드입니다. 별도의 str 및 유니 코드 클래스를 사용해야 할 이유가 없습니다. IMHO, 문자열 및 바이트 배열은 동일한 추상화로 표현 해서는 안됩니다 . 문자열 클래스는 텍스트를 저장하고 조작하기위한 것이어야합니다. 내부 표현은 실제로 신경 쓰지 않습니다. 문자열 내 특정 바이트에서 잘라 내기 / 바꾸기 / 삭제 / 삽입과 같은 작업을 수행하지 않아야 합니다 . 특정 문자 에서이 작업을 수행하려고합니다 . 영어 이외의 입력을 입력 할 때 차이점을 잊어 버리고 코드가 날아 가기 쉽습니다.
MAK

1
@limscoder : 유니 코드를 쉽게 보려면 Tcl을 사용해보십시오. 몇 년 전에 Tcl에서 Python으로 전환해야했고 소년은 원시 파이썬의 유니 코드 지원이 어떻게 비교되는지 놀랐습니다. Tcl에서는 보이지 않고 파이썬에서는 큰 고통입니다.
Bryan Oakley

18

변경 가능한 데이터 형식의 기본 인수

def foo(a, L = []):
    L.append(a)
    print L

>>> foo(1)
[1]
>>> foo(2)
[1, 2]

일반적으로 미묘한 버그의 결과입니다. 모든 함수 호출에 사용할 단일 객체를 만드는 대신 기본 인수가 필요할 때마다 새 목록 객체를 만들면 더 좋을 것이라고 생각합니다.

편집 : 그것은 큰 문제는 아니지만 문서에서 무언가를 참조해야 할 때 일반적으로 문제임을 의미합니다. 필요하지 않습니다.

def foo(a, L = None):
    if L is None:
        L = []
    ...

특히 그것이 기본값이었을 때. 예상 한 것과 일치하지 않고 많은 상황에 유용하지 않은 이상한 행동 일뿐입니다.


나는 이것에 대해 많은 불만을 보았지만 사람들이 기본 인수로 빈 목록 (함수가 수정 한)을 주장하는 이유는 무엇입니까? 이것이 정말로 큰 문제입니까? 즉, 이것이 진짜 문제입니까?
Martin Vilcans

8
그것은 최소한의 놀라움의 원칙을 위반합니다. 함수의 매개 변수가 모든 호출에서 살아남을 것으로 기대하지는 않습니다.
aib

그것은 스크립팅 언어의 결과입니다. 당신은이 버그에 의해서만 혼란에 빠질 것입니다. 이 버그를 스스로 알아내는 것은 실제로 스크립트 언어라는 사실을 상기시키기 위해 엉덩이를 걷어차 게합니다. 그리고 그것은 언어가 스크립팅 측면을 숨기는 데 능숙하기 때문입니다 (올바르게 사용한다고 가정).
Zoran Pavlovic

호기심에서 @ZoranPavlovic, 왜 이것이 스크립팅 언어의 결과입니까? 데이터가 바인딩 될 때와 목록이 변경 가능하기 때문에 문제가있는 것 같습니다 (일반적으로 좋은 두 가지이지만 함께 결합하면 나쁜 것입니다). 함수가 호출 될 때마다 새 목록을 작성하지 않고 함수 작성시 데이터를 바인드 한 경우 비 스크립트 언어에서도 동일한 문제가 발생할 수 있습니다.
jsternberg

@ aib : 다른 파이썬 객체와 마찬가지로 여기의 매개 변수는 객체에 대한 포인터라고 생각하지 않습니다. 이 경우 객체는 변경 가능하며 함수가 선언 될 때 변수가 바인딩됩니다. 이 매개 변수는 "호출에서 존속"하지만 변하지 않는 오브젝트에 대한 참조입니다.
Patrick Collins

14

개발 언어처럼 융통성있게 만드는 Python의 일부 기능은 C ++ 및 Java와 같은 언어로 컴파일 및 링크 프로세스를 통해 수행되는 "전체 프로그램"정적 분석에 사용되는 기능의 주요 단점으로도 간주됩니다.

  • 로컬 변수의 암시 적 선언

지역 변수는 일반 할당 문을 사용하여 선언됩니다. 즉, 다른 범위의 변수 바인딩에는 컴파일러가 명시 적 주석을 선택해야합니다 (외부 범위에 대한 전역 및 비 로컬 선언, 인스턴스 범위에 대한 속성 액세스 표기). 이는 프로그래밍시 필요한 상용구의 양을 크게 줄이지 만 명시 적 변수 선언이 필요한 언어로 컴파일러에서 처리하는 검사를 수행하려면 타사 정적 분석 도구 (예 : pyflakes)가 필요합니다.

  • "원숭이 패치"가 지원됩니다

모듈, 클래스 객체 및 내장 네임 스페이스의 내용은 런타임에 수정할 수 있습니다. 이것은 매우 강력하여 많은 유용한 기술을 허용합니다. 그러나 이러한 유연성으로 인해 Python은 정적으로 형식화 된 OO 언어에 공통적 인 기능을 제공하지 않습니다. 특히 인스턴스 메소드에 대한 "self"매개 변수는 암시 적보다는 명시 적입니다 ( "메소드"는 클래스 내부에서 정의 할 필요가 없으므로 나중에 클래스를 수정하여 추가 할 수 있으므로 특히 실용적이지 않음을 의미 함) 코드가 클래스의 "내부"또는 "외부"인지 여부에 따라 속성 액세스 제어를 쉽게 적용 할 수 없습니다 (클래스 정의가 실행되는 동안에 만 구별이 존재하기 때문에).

  • 금속에서 멀리

이것은 다른 많은 고급 언어에서도 마찬가지이지만 파이썬은 대부분의 하드웨어 세부 사항을 추상화하는 경향이 있습니다. C 및 C ++와 같은 시스템 프로그래밍 언어는 여전히 직접 하드웨어 액세스를 처리하는 데 훨씬 적합합니다 (단, Python은 CPython 확장 모듈 또는보다 포터블하게는 ctypes라이브러리 를 통해 해당 시스템과 즐겁게 대화합니다 ).


12
  1. {} / begin-end 대신 코드 블록에 들여 쓰기를 사용하십시오.
  2. 모든 최신 현대 언어에는 적절한 어휘 범위가 있지만 파이썬은 없습니다 (아래 참조).
  3. 혼란스러운 문서들 (Perl5 문서와 비교해보십시오).
  4. 해협-재킷 (단 하나의 방법이있다).

깨진 범위 지정의 예; 통역 세션의 성적표 :

>>> x=0
>>> def f():
...     x+=3
...     print x
... 
>>> f()
Traceback (most recent call last):
  File "", line 1, in ?
  File "", line 2, in f
UnboundLocalError: local variable 'x' referenced before assignment

global그리고 nonlocal키워드는이 디자인의 어리 석음을 패치하기 위해 도입되었다.


2
범위 지정과 관련하여 현재 방법의 추론을 이해하기 위해 python.org/dev/peps/pep-3104 를 살펴 보는 것이 좋습니다 .
윈스턴 에워 트

+1에 동의하십시오. +1입니다.
Jas

34
한 가지 방법은 장점이 있습니다. 다른 사람의 코드를 읽을 때 단일 진술을 해독 할 수 없습니다. 관용구가 뇌에 고정되어 있으면 즉시 인식해야합니다.
rox0r

9
@ rox0r에 완전히 동의하십시오. "스트레이트 재킷"은 모든 종류의 구문 전쟁을 방지합니다.
keithjgrant

8
솔직히 말해서 파이썬 에서 global또는 nonlocal키워드가 거의 필요하지 않습니다 . 그래서 나는이 문제가 존재한다는 것을 잊어 버리지 않으며 직장에서 매일 파이썬 코드를 작성한다는 사실에도 불구하고 몇 번이나 다시 검색해야합니다. 나에게 전역 변수 (또는 더 나쁜 외부 전역 변수)를 수정 해야하는 코드는 코드 냄새입니다. 일반적으로 (항상 그런 것은 아님) 더 좋은 방법이 있습니다.
Ben

11

파이썬의 객체 지향 this.method()및 절차 적 / 기능적 method(this)구문 조합이 매우 불안정 하다는 것을 알았습니다 .

x = [0, 1, 2, 3, 4]
x.count(1)
len(x)
any(x)
x.reverse()
reversed(x)
x.sort()
sorted(x)

메소드가 아닌 많은 함수가 전역 네임 스페이스에 덤프되기 때문에 특히 나쁩니다 . 목록, 문자열, 숫자, 생성자, 메타 프로그래밍과 관련된 메소드가 모두 알파벳 순서로 정렬 된 하나의 큰 목록으로 혼합되어 있기 때문 입니다.

최소한 F #과 같은 기능적 언어는 모듈에서 네임 스페이스가 올바르게 지정된 모든 기능을 갖습니다.

List.map(x)
List.reversed(x)
List.any(x)

그래서 그들은 모두 함께 있지 않습니다. 또한 이것은 라이브러리 전체에 적용되는 표준이므로 최소한 일관됩니다.

나는 함수메서드 일 을하는 이유를 이해 하지만 여전히 이것을 이렇게 섞는 것은 나쁜 생각이라고 생각합니다. 적어도 일반적인 작업에서 method-syntax를 따르는 경우 훨씬 더 행복 할 것입니다.

x.count(1)
x.len()
x.any()
x.reverse()
x.reversed()
x.sort()
x.sorted()

메소드가 변경되는지 여부에 관계없이 메소드를 오브젝트의 메소드로 사용하면 몇 가지 장점이 있습니다.

  • 데이터 유형에 대한 "공통"작업을 찾는 단일 장소 : 기타 라이브러리 등 데이터 유형에 대해 수행 할 수있는 다른 멋진 작업이있을 수 있지만 "기본"작업은 모두 개체의 메서드에 있습니다.
  • Module전화 할 때 계속 반복 할 필요가 없습니다 Module.method(x). 위의 기능 목록 예제를 보았는데 왜 계속해서 말해야 List합니까? 그것이 a라는 것을 알아야 List하며 Navigation.map()함수 를 호출하고 싶지 않습니다 ! x.map()구문을 사용하면 건조하고 모호하지 않습니다.

물론 전 세계적으로 사용되는 네임 스페이스 방식 보다 장점이 있습니다. 현재의 방식으로는 불가능 하지 않다 작업을 수행 있는 것은 . len(lst)네임 스페이스가 없기 때문에 꽤 간결합니다 ( )! 메서드보다 함수 (기본 동작 등)를 사용할 때의 이점을 이해하지만 여전히 마음에 들지 않습니다.

지저분합니다. 그리고 큰 프로젝트에서 혼란은 최악의 적입니다.


1
예. LINQ 스타일이 정말 그립습니다 (LINQ가 처음으로 구현 한 것은 아니지만 가장 익숙합니다) 목록 처리.
CookieOfFortune

1
len (x)를 메소드로 생각하지 마십시오. "len"은 기능입니다. 파이썬에는 함수 메소드가 있으며 그 접근법에는 아무런 문제가 없습니다. 적절한 기능의 부족은 대개 많은 불필요한 타이핑의 원천입니다.
rbanffy

나는 len()기능과 장점이 무엇인지 안다 . 또한 왜 이것이 나쁜 생각이라고 생각하는지, 왜 글로벌 함수가 특히 나쁜 생각이라고 생각하는지, 왜 메소드가 기능을 구성하고 범위를 지정하는 편리한 방법을 제공한다고 생각하는지 =)
Haoyi

42 개 키워드 (또는 43 개 키워드)가 '큰'숫자라고 생각하지 않습니다. 또한 def, class및 기타 비 기능 호출과 같은 것들이 포함됩니다 . 대부분의 다른 인기있는 언어에서 100 이상과 비교하십시오. 또한,에서 라인을 고려 import this: Namespaces are one honking great idea -- let's do more of those!. ) 난 당신이 파이썬 네임 스페이스를 오해 것 같아요
웨인 베르너

8

호모 닉 부족 .

파이썬은 3.x가 "with"키워드를 추가 할 때까지 기다려야했습니다. 어떤 호모 닉 언어로도 사소하게 라이브러리에 추가되었을 수 있습니다.

답변에서 본 다른 대부분의 문제는 3 가지 유형 중 하나입니다.

1) 툴링으로 고칠 수있는 것 (예 : 파이크 레이크) 2) 구현 세부 사항 (GIL, 성능) 3) 코딩 표준으로 고칠 수있는 것 (즉, 사람들이 원하지 않는 기능)

# 2는 언어의 문제가 아니며, IMO # 1과 # 3은 심각한 문제가 아닙니다.


1
with파이썬 2.5에서 사용할 수있었습니다 from __future__ import with_statement,하지만 난 가끔 불행한 것으로 나타났습니다 동의처럼 문 if/ for/ print/ 등 대신 일반 기능의 "특별한"입니다
DBR

7

파이썬은 표현력이 뛰어나서 내가 가장 좋아하는 언어이지만 여전히 실수를 너무 많이하지는 않습니다. 나는 여전히 나를 괴롭히는 몇 가지가 있습니다.

  • 실제 익명 기능이 없습니다. Lambda는 단일 문 함수에 사용할 수 있으며이 with문은 Ruby에서 코드 블록을 사용하는 많은 곳에 사용할 수 있습니다. 그러나 어떤 상황에서는 상황을 좀 더 서투르게 만듭니다. (자바에서와 같이 서투른에서 멀지 만 여전히 ...)

  • 모듈과 파일 사이의 관계에 약간의 혼란이 있습니다. 명령 행에서 "python foo.py"를 실행하는 것은 "import foo"와 다릅니다. Python 2.x의 상대적 가져 오기도 문제를 일으킬 수 있습니다. 여전히 파이썬의 모듈은 C, C ++ 및 Ruby의 해당 기능보다 훨씬 낫습니다.

  • 명백하다 self. 나는 그 이유 중 일부를 이해하고 매일 파이썬을 사용하더라도 잊어 버리는 실수를 저지르는 경향이 있습니다. 또 다른 문제는 모듈에서 클래스를 만드는 것이 약간 지루하다는 것입니다. 명백한 자아는 다른 사람들이 불평 한 범위 제한과 관련이 있습니다. 파이썬에서 가장 작은 범위는 함수 범위입니다. 기능을 작게 유지하면 문제 자체가 아니며 IMO는 종종 더 깨끗한 코드를 제공합니다.

  • 와 같은 일부 전역 함수 len는 메서드가 될 것으로 예상됩니다 (실제로 배후에 있습니다).

  • 상당한 들여 쓰기. 내가 생각하는 아이디어 자체는 아니지만 이것이 많은 사람들이 파이썬을 사용하지 못하게하는 유일한 방법이기 때문에 파이썬은 (선택적) 시작 / 종료 기호로 더 나을 것입니다. 그 사람들을 무시하고, 들여 쓰기를 위해 강제 된 크기로 완전히 살 수있었습니다.

  • JavaScript 대신 웹 브라우저의 내장 언어가 아닙니다.

이 불만들 중, 내가 언어에 추가되어야한다고 생각하는 것은 내가 가장 신경 쓰는 첫 번째 질문 일뿐입니다. 다른 하나는 마지막을 제외하고는 약간 작습니다.


+1 datetime.datetime.now()한 프로젝트가 언제 쓸 수 datetime.now있고 두 프로젝트를 믹싱하는 방법을 쓰는지 궁금해합니다. 다른 프로젝트를 배제하는 것은 확실합니다. 확실히 Java에서는 발생하지 않았을 것입니다. (?) 두 가지 사용법을 모두 수행 할 때 모듈이 파일과 파일을 혼동하는 일반적인 방법이 어떻게 보이는지 알면 self호출은 함수와 동일한 수의 인수를 가지지 않기 때문에 여전히 이해하려고합니다. 그리고 VM 파이썬이 느리다고 생각할 수 있습니까?
Niklas Rosencrantz

명시 적 자체 키워드 관련 문제에 대해 좋은 파이썬 IDE를 사용하는 것이 좋습니다. Eclipse의 PyDev가 클래스 내에서 쓰는 것을 감지하면 함수 서명의 자체 부분을 자동 완성합니다.
Zoran Pavlovic

5

파이썬은 완전히 성숙하지 않았습니다 : 현재 파이썬 3.2 언어는 현재 배포 된 대부분의 패키지와 호환성 문제가 있습니다 (일반적으로 파이썬 2.5와 호환됩니다). 이는 현재 더 많은 개발 노력이 필요한 큰 결점입니다 (필요한 패키지 찾기, 호환성 확인, 더 호환 가능할 수있는 좋지 않은 패키지 선택 무게 측정, 최상의 버전 사용, 며칠이 걸릴 수있는 3.2로 업데이트). 유용한 일을 시작하십시오).

아마도 2012 년 중반에는 이것이 단점이되지 않을 것입니다.

팬보이에 의해 다운 보트 된 것 같습니다. 개발자 토론에서 우리의 고급 개발자 팀도 같은 결론에 도달했습니다.

성숙도는 한 가지 주요 의미에서 팀이 기술을 사용할 수 있으며 숨겨진 위험 (호환성 문제 포함)없이 매우 빠르게 가동 및 실행할 수 있음을 의미합니다. 오늘날 대부분의 패키지에서 타사 파이썬 패키지 및 많은 앱이 3.2 미만에서 작동하지 않습니다. 이것은 덜 성숙한 기술인 문제를 해결하는 대신 기술 자체를 재 구현하는 더 많은 통합, 테스트 작업을 만듭니다.

2013 년 6 월 업데이트 : Python 3에는 여전히 성숙 문제가 있습니다. 팀 구성원은 종종 필요한 패키지에 대해 언급하고 "2.6 만 제외"라고 말합니다 (일부 경우에는 localhost 소켓을 통해 2.6 전용 패키지를 2.6으로 사용하고 나머지는 2.6을 사용하는 해결 방법을 구현했습니다) 우리의 도구는 3.2)로 유지됩니다. 순수 파이썬 위키 인 MoinMoin조차도 파이썬 3으로 작성되지 않았습니다.


2
성숙도에 대한 정의 가 설계 상 호환되지 않는 버전과 호환되지 않는 경우에만 동의합니다 .
tshepang

3
파이썬의 두 가지 호환되지 않는 스트림은 문제이지만 (왜 그렇게했는지 이해할 수는 있지만) "성숙도"의 문제로 보지 못합니다.
Winston Ewert

어떤 의미에서 성숙함은 팀이 기술을 사용할 수 있으며 숨겨진 위험 (호환성 문제 포함)없이 매우 빠르게 가동 및 운영 될 수 있음을 의미합니다. 오늘날 대부분의 패키지에서 타사 파이썬 패키지 및 많은 앱이 3.2 미만에서 작동하지 않습니다. 이것은 덜 성숙한 기술인 문제를 해결하는 대신 기술 자체를 재 구현하는 더 많은 통합, 테스트 작업을 만듭니다.
조나단 클라인 IEEE

2
그런 다음 Python 2.x를 사용하십시오. 알다시피 ... 모두가 사용하는 버전입니다. 또는 패키지 설명서를 2 초 동안 읽고 호환되는 버전을 찾으십시오.
jsternberg

2
"파이썬 3.0이 얼마 동안 출시되었다고해서 반드시 사용해야하는 버전을 의미하는 것은 아닙니다. 파이썬 3.0과 2.x는 동시에 개발되고 있습니다. 앞으로 우리 모두가 사용할 수 있기를 바랍니다. python 3.0, 그러나 현재로서는 2.x를 사용하는 것이 좋은 해결책입니다. "-> 500 자에 달하는 방법입니다. 아직 성숙하지 않았습니다.
Jonathan Cline IEEE 2

4

파이썬의 범위 지정이 잘못되어 파이썬에서 객체 지향 프로그래밍이 매우 어색합니다.


8
예를 들어 줄 수 있습니까? (나는 당신이 옳다고 확신하지만, 예를 드리고 싶습니다)
Winston Ewert

24
나는 파이썬을 좋아하지만 인스턴스 속성과 메소드에 대한 모든 참조 앞에 넣어야한다는 것을 절대 멸시self. 합니다. 루비에서하는 것처럼 파이썬을 사용하여 DSL을 만드는 것은 불가능합니다.
Adam Crossland

35
나는 어색함을 찾지 못합니다. 나는 명백 함을 좋아합니다.
Winston Ewert

9
나는 명백한 자아에 대한 큰 문제가 무엇인지 알지 못한다. C ++, Java 및 D에서 사람들은 어쨌든 밑줄로 접두어를 붙이는 등의 방법으로 멤버 변수를 규칙에 의해 명시 적으로 만듭니다.
dsimcha

7
선언과 다른 메소드에서 self를 사용합니다 : def foo (self) but self.foo (). 나는 명시 적 정의가 있지만 암묵적인 비하인드 스토리가 너무 예쁘지 않다는 것을 알았습니다.
LennyProgrammers

4

파이썬에 대한 나의 그립 :

  • Bolted-on OOP (세부 사항은 @mipadi의 답변 참조)
  • 람다의 깨진 구현
  • 범위 문제
  • 표준 라이브러리에 영구 컬렉션이 없습니다.
  • 임베디드 DSL에 대한 취약성

왜 공감해야합니까?
missingfaktor

나는 downvoter가 아니지만 왜 OO가 강화되었다고 생각하는지 설명 할 수 있습니까? 파이썬에는 항상 OO가 있었으며 언어의 핵심 부분입니다.
데니스

@mipadi의 답변을 참조하십시오.
missingfaktor


4

파이썬의 액세스 수정자는 강제적이지 않으므로 잘 구조화되고 모듈화 된 코드를 작성하기가 어렵습니다.

나는 이것이 @Mason의 깨진 범위 지정의 일부라고 생각합니다.이 언어와 관련하여 큰 문제입니다. 읽을 수 있어야하는 코드의 경우 범위 내에서 무엇이 될 수 있고 어떤 시점에 어떤 값이 있을지 파악하기가 매우 어려워 보입니다. 현재 이러한 단점으로 인해 파이썬 언어에서 벗어날 생각입니다. .

"우리 모두가 동의하는 성인"이라해서 특히 복잡한 프로젝트에서 작업 할 때 실수를하지 않고 강력한 구조 내에서 더 잘 작동하지 않는다는 의미는 아닙니다. 들여 쓰기와 의미없는 밑줄로는 충분하지 않은 것 같습니다 .


따라서 액세스 제어 부족은 좋지 않습니다 ...하지만 로컬이 아닌 네임 스페이스에 대한 변수 쓰기의 명시적인 범위 지정도 좋지 않습니까?
ncoghlan

@ncoghlan : 1-해당 기능은 프로젝트 구성 방법에 따라 많은 현대 언어에서 표준입니다. 2-프로그래머가 제어합니다. 3-그 점이 무엇인지 확실하지 않은 경우-대부분의 컴파일 된 언어 / IDE에서 몇 가지 프로젝트 설정으로 범위를 쉽게 제어 할 수 있습니다. '우리 모두가 동의하는 성인'이라면, 우리는 우리 자신의 결정을 내릴 수 있고 우리의 특정한 안락 수준에 따라 범위를 조정할 수 있어야합니다.
벡터

2
문제는 "강제 액세스 제어"를 요구하는 사람들이 우리에게 파이썬을 훌륭한 접착제 언어로 만드는 것 중 하나를 꺼내도록 요구하고 있다는 것입니다. 개발자가 나중에 코드 사용 방식을 제어하는 ​​것은 의도적으로 어렵 습니다. C ++ 및 Java 패턴의 상용구 중 얼마나 많은 부분이 강제 액세스 제어를 해결하기위한 것입니까? 그런 이유로 파이썬을 사용하지 않기로 선택한 사람들을 확실히 이해할 수 있지만 정적 시행은 엄격한 테스트를 대신 할 수 없습니다.
ncoghlan

1
@ncoghlan-나에게 파이썬의 위대한 점은 구문과 간결함-표현력의 우아함입니다. 내가 말했듯이, 범위는 프로그래머가 코드 구조와 조직보다해야 할 일을 엉망으로 만드는 것과 관련이 없으므로 '성인 합의'의 개념은 무의미합니다. 간단한 유틸리티와 스크립트가 아닌 복잡한 프로젝트를 진행하고 있습니다. 코드는 신중하게 모듈화되고 구조화되어야합니다. 액세스 수정자는이를 보장하는 가장 중요한 방법 중 하나입니다.
벡터

1
그리고 코드 검토, 교육 및 커플 링 분석도 있습니다. 나에게 강제 액세스 제어는 정적 타이핑과 동일한 버킷에 속한다. 그것들은 정확성에 대한 추가적인 신뢰를 제공하는 데 도움이되지만 (광범위한 테스트의 필요성을 피하기에 충분하지는 않지만) 개발 생산성에 높은 비용이 든다. (실제적으로, 클래스 속성 액세스 제어는 메소드가 클래스에서 검색된 일반 함수 인 Python의 객체 모델에도 적합하지 않습니다. 클래스에 대한 "내부 / 외부"경계는 실제로 존재하지 않기 때문에 클래스가 될 수 없습니다. 시행)
ncoghlan

3
  1. 성능은 좋지 않지만 파이로 개선되고 있습니다.
  2. GIL은 스레딩을 사용하여 코드 속도를 높이 지 않습니다 (일반적으로 조기 최적화 임에도 불구하고).
  3. 응용 프로그램 프로그래밍에만 유용합니다.

그러나 여기에는 훌륭한 구속 기능이 있습니다.

  1. RAD에 완벽합니다.
  2. C와 인터페이스하기 쉽고 (C가 파이썬 인터프리터를 내장하기 위해)
  3. 매우 읽기 쉽습니다
  4. 배우기 쉽습니다.
  5. 잘 문서화되어 있습니다.
  6. 배터리는 실제로 포함되어 있으며 표준 라이브러리는 크며 pypi에는 거의 모든 모듈이 포함되어 있습니다.
  7. 건강한 공동체가 있습니다.

장점을 언급 한 이유는 무엇입니까? 문제에 대한 질문. 어쨌든 응용 프로그램 프로그래밍에만 유용하다는 의미는 무엇입니까? 다른 프로그래밍이 있습니까? 구체적으로 좋지 않은 것은 무엇입니까?
tshepang

5
이점이 단점보다 더 크다고 생각하기 때문에 이점을 나열했습니다. 파이썬에서 리눅스 커널 모듈을 구현하려고 시도한 적이 있습니까?
dan_waterworth

3

나는 파이썬을 선호하고 내 마음에 오는 첫 번째 단점은 명령문을 주석 처리 할 때 if myTest():C 또는 Java와 관련이없는 전체 실행 블록의 들여 쓰기를 변경해야한다는 것입니다. 사실 파이썬에서는 if-clause를 주석 처리하는 대신 다음과 같이 주석 처리하기 시작했습니다.`if True : #myTest () 그래서 다음 코드 블록도 변경할 필요가 없습니다. Java와 C는 들여 쓰기에 의존하지 않기 때문에 C와 Java로 문장을보다 쉽게 ​​주석 처리 할 수 ​​있습니다.


1
들여 쓰기를 변경하지 않고 일부 코드의 블록 레벨을 변경하기 위해 C 또는 Java 코드를 심각하게 편집 하시겠습니까?
Ben

4
@Ben 일시적으로, 네 ...
대안

1
@ben도 마찬가지입니다.
Christopher Mahan

2
나는 변화의 트릭을 사용 if something()하는 방법에 대해 if False and something(). 또 다른 트릭은 여러 줄 문자열을 사용하여 "주석"하는 것입니다.
Martin Vilcans

1
@ 마틴 물론! 만약 거짓이라면 ...
Christopher Mahan

3

다중 디스패치는 기존 단일 디스패치 유형 시스템과 잘 통합되지 않으며 성능이 떨어집니다.

동적 로딩은 POSIX와 같은 의미 체계가 메타 데이터 집약적 인 작업을 위해 치명적인 속도 저하를 야기하는 병렬 파일 시스템에서 큰 문제입니다. 65k 코어에 Python (numpy, mpi4py, petsc4py 및 기타 확장 모듈 포함)을로드하는 데 150 만 시간의 코어 시간을 소비 한 동료가 있습니다. (시뮬레이션은 상당한 새로운 과학적 결과를 제공했지만 그만한 가치가 있었지만 한 번 이상 석유를 태워 파이썬을 적재하기 위해 태워 버릴 때 문제가되었습니다.) 정적으로 연결할 수 없기 때문에 우리는 큰 왜곡으로 가야했습니다. dlopen일괄 파일 시스템 액세스를 수행하도록 libc-rtld 패치를 포함하여 규모에 맞는 적절한로드 시간 .


와우, 매우 기술적으로 보인다, 당신은 주제에 대한 참조 자료, 예제, 블로그 게시물 또는 기사가 있습니까? 가까운 시일 내에 그러한 사례에 노출 될 수 있을지 궁금합니다.
Vincent

Aron은 SciPy 2012에서 연설을했습니다 . dlopen물건 우리에 collfs의 라이브러리입니다. 이 저장소에는 Asher Langton의 경로 캐싱에서 영감을 얻은 추가 zipimport 트릭도 포함되어 있습니다. 우리는 더 나은 배포와 논문을 연구하고 있습니다.
Jed

3
  • 널리 사용되는 매우 많은 주류 타사 라이브러리 및 소프트웨어는 꽤 파이썬 적이 지 않습니다. 몇 가지 예 : soaplib, openerp, reportlab. 비판은 범위를 벗어 났고, 거기에 있으며, 널리 사용되지만, 파이썬 문화를 혼란스럽게 만듭니다 ( '한 가지 분명한 방법이 있어야합니다. 알려진 pythonic 성공 (예 : django 또는 trac)은 예외로 보입니다.
  • 인스턴스, 클래스, 메타 클래스의 무한한 추상화 깊이는 개념적으로 아름답고 독창적입니다. 그러나 그것을 마스터하려면 인터프리터 (파이썬 코드가 해석되는 순서 등)를 깊이 알아야합니다. C # 제네릭과 같은 유사한 흑 마법 (IMHO)은 개념적으로보다 복잡하고 (IMHO) 비례 적으로 더 널리 알려지고 사용되는 것 같습니다.
  • 메모리와 스레딩 모델을 잘 이해하려면 포괄적 인 사양이 없기 때문에 파이썬에 익숙해야합니다. 통역사의 출처를 읽거나 문제를 경험하고 문제를 해결하는 방법을 발견했기 때문에 무엇이 효과가 있는지 알고 있습니다. 예를 들어, 강하고 약한 참조 만 있고 Java의 부드럽고 팬텀 참조는 없습니다. Java에서 가비지 수집을위한 스레드가 있지만 가비지 수집이 파이썬에서 언제 발생하는지에 대한 공식적인 답변은 없습니다. 파이썬 코드가 실행되지 않으면 가비지 수집이 발생하지 않는다는 것을 관찰하고 메모리를 할당하려고 할 때 때때로 발생한다고 결론 지을 수 있습니다. 잠긴 리소스가 출시되지 않은 이유를 모르는 경우 까다로울 수 있습니다 (내 경험은 freeswitch의 mod_python이었습니다).

어쨌든, 파이썬은 4 년 동안 나의 주요 언어입니다. fanboy, elitists 또는 monomaniacs가되는 것은 파이썬 문화의 일부가 아닙니다.


+1. 메모리 및 스레딩 모델에 대한 사양이 바로 있습니다. 그러나 FWIW, Java 가비지 수집기는 스레드 (및 대부분의 GC에 관한 모든 것)는 Java 언어 또는 VM 사양 자체의 측면이 아니지만 특정 JVM 구현의 문제입니다. 그러나 주요 Sun / Oracle JVM은 JVM 튜닝에 관한 전체 서적이 출판되는 정도까지 광범위하게 문서화 된 GC 동작 및 구성 가능성에 대해 문서화되어 있습니다. 이론적으로 언어 사양에 관계없이 동일한 방식으로 CPython을 문서화 할 수 있습니다.
Andrew Janke

2
  • 이상한 OOP :
    • len(s)를 통해 __len__(self)다른 "특별한 방법"
    • 다른 특수 방법 ( __add____iadd__for ++=) 에서 파생 될 수있는 추가 특수 방법
    • self 첫 번째 방법 매개 변수로
    • 기본 클래스 생성자를 호출하는 것을 잊을 수 있습니다.
    • 액세스 수정 자 없음 (개인, 보호 ...)
  • 상수 정의 없음
  • 사용자 정의 유형에 대한 불변성이 없음
  • 성능이 좋지 않아 Python과 C가 혼합되고 빌드 문제가 발생합니다 (C 라이브러리, 플랫폼 종속성 찾기 ...)
  • 특히 타사 라이브러리에서 잘못된 문서
  • Python 2.x와 3.x의 비 호환성
  • 열악한 코드 분석 도구 (Java 또는 C #과 같이 정적으로 유형이 지정된 언어와 비교하여)

5
개인적으로 저는 2.x와 3.x 간의 비 호환성이 Python의 가장 큰 장점 중 하나라고 생각합니다. 물론 단점 이기도 합니다. 그러나 이전 버전과의 호환성을 깨기 위해 개발자의 대담함은 끝없이 뭉개지 않아도 될 수 있음을 의미합니다. 더 많은 언어에는 그러한 점검이 필요합니다.
Konrad Rudolph

0

"Immutability"는 정확히 장점이 아닙니다. AFAIK 숫자, 튜플 및 문자열은 변경할 수 없으며 다른 모든 것 (예 : 객체)은 변경할 수 있습니다. Erlang 또는 Haskell과 같은 기능적 언어와 비교하면 모든 것이 불변입니다 (기본적으로).

그러나 불변성은 실제로 동시성으로 빛납니다.이 또한 파이썬의 장점이 아니기 때문에 적어도 결과입니다.

(* = nitpickers의 경우 : 나는 적어도 부분적으로 평행 한 동시성을 의미합니다. 불변성이 중요하지 않은 "단일 스레드"의 동시성이 있으면 Python이 정상이라고 생각합니다 (예, FP 애호가, 불변성은 동시성이 없어도 좋습니다.))


0

명시 적으로 병렬 구조를 갖고 싶습니다. 더 자주, 내가 목록 이해를 쓸 때

[ f(x) for x in lots_of_sx ]

요소가 처리되는 순서는 중요하지 않습니다. 때때로, 나는 그들이 어떤 순서로 돌아 오는지도 신경 쓰지 않습니다.

내 f가 순수 Python 일 때 CPython이 잘 수행하지 못하더라도 다른 구현에서 사용할 수 있도록 이와 같은 동작을 정의 할 수 있습니다.


// 스폰 된 스레드 묶음 // 대기열에 큐 대기열 전달 que.extend ([x for lots_of_sx] x) que.wait () # 모든 lots_of_sx가 스레드에 의해 처리 될 때까지 기다립니다.
Zoran Pavlovic

0

파이썬에는 테일 콜 최적화 기능이 없습니다 . 주로 철학적 인 이유로 . 즉, 대형 구조에서 꼬리 재귀를 사용하면 O (n) 메모리 (비용이 많이 들지 않는 스택 때문에)가 발생할 수 있으며 재귀를 루프로 다시 작성하여 O (1) 메모리를 가져와야합니다.

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