it-swarm-vi.com

Nhược điểm của Python là gì?

Python dường như tất cả những cơn thịnh nộ ngày nay, và không đáng lo ngại - vì nó thực sự là một ngôn ngữ mà người ta gần như thích được đưa ra một vấn đề mới để giải quyết. Nhưng, như một người khôn ngoan đã từng nói (gọi anh ta là người khôn ngoan chỉ vì tôi không biết ai thực sự nói điều đó; không chắc anh ta có khôn ngoan không tất cả), để thực sự biết một ngôn ngữ, người ta không chỉ biết cú pháp, thiết kế, v.v., những ưu điểm mà còn cả nhược điểm của nó. Không có ngôn ngữ nào là hoàn hảo, một số chỉ tốt hơn những ngôn ngữ khác.

Vì vậy, những gì sẽ là theo ý kiến ​​của bạn, nhược điểm khách quan của Python.

Lưu ý: Tôi không yêu cầu so sánh ngôn ngữ ở đây (nghĩa là C # tốt hơn Python vì ... yadda yadda yadda) - nhiều mục tiêu hơn (ở một mức độ nào đó) ý kiến ​​về các tính năng ngôn ngữ được thiết kế tồi, cho dù, có thể một số bạn đang thiếu trong đó và v.v. Nếu phải sử dụng ngôn ngữ khác để so sánh, nhưng chỉ để minh họa một điểm khó có thể giải thích bằng cách khác (ví dụ: dễ hiểu)

147
Rook

Tôi sử dụng Python hơi thường xuyên và nói chung tôi coi đó là một ngôn ngữ rất tốt. Tuy nhiên, không có ngôn ngữ nào là hoàn hảo. Dưới đây là những hạn chế theo thứ tự quan trọng đối với cá nhân tôi:

  1. Nó chậm. Ý tôi là thực sự, rất chậm. Rất nhiều lần điều này không thành vấn đề, nhưng nó chắc chắn có nghĩa là bạn sẽ cần một ngôn ngữ khác cho các bit quan trọng về hiệu năng.

  2. Các hàm lồng nhau loại mà bạn không thể sửa đổi các biến trong phạm vi bên ngoài. Chỉnh sửa: Tôi vẫn sử dụng Python 2 do hỗ trợ thư viện và lỗi thiết kế này gây khó chịu cho tôi, nhưng dường như nó đã được sửa trong Python 3 do câu lệnh không nhắm mục tiê . Không thể đợi các lib tôi sử dụng được chuyển để lỗ hổng này có thể được gửi đến tro đống lịch sử cho tốt.

  3. Nó thiếu một vài tính năng có thể hữu ích cho thư viện/mã chung và IMHO là sự đơn giản được đưa đến các thái cực không lành mạnh. Các loại quan trọng nhất tôi có thể nghĩ đến là các loại giá trị do người dùng xác định (Tôi đoán chúng có thể được tạo bằng ma thuật siêu dữ liệu, nhưng tôi chưa bao giờ thử) và tham số chức năng ref.

  4. Nó cách xa kim loại. Cần phải viết nguyên thủy luồng hoặc mã hạt nhân hoặc một cái gì đó? Chúc may mắn.

  5. Mặc dù tôi không bận tâm đến việc thiếu khả năng bắt lỗi ngữ nghĩa trả trước như một sự đánh đổi cho tính năng động mà Python cung cấp, tôi muốn có một cách để bắt lỗi cú pháp và những điều ngớ ngẩn như nhập sai tên biến mà không phải thực sự chạy mã.

  6. Tài liệu này không tốt bằng các ngôn ngữ như PHP và Java có sự hỗ trợ mạnh mẽ của công ty.

109
dsimcha

Tôi ghét điều đó Python không thể phân biệt giữa khai báo và sử dụng biến. Bạn không cần gõ tĩnh để thực hiện điều đó. Thật tuyệt khi có cách nói về điều này là một biến mà tôi cố tình khai báo và tôi dự định để giới thiệu một tên mới, đây không phải là một lỗi đánh máy.

Hơn nữa, tôi thường sử dụng các biến Python theo kiểu ghi một lần, nghĩa là tôi coi các biến là bất biến và không sửa đổi chúng sau lần gán đầu tiên. Nhờ các tính năng như hiểu danh sách , điều này thực sự cực kỳ dễ dàng và làm cho dòng mã dễ theo dõi hơn.

Tuy nhiên, tôi có thể tài liệu thực tế đó. Không có gì trong Python ngăn tôi hình thành ghi đè hoặc sử dụng lại các biến.

Tóm lại, tôi đã muốn có hai từ khóa trong ngôn ngữ: varlet. Nếu tôi viết vào một biến không được khai báo bởi một trong hai biến đó, Python sẽ phát sinh lỗi. Hơn nữa, let khai báo các biến là chỉ đọc, trong khi var các biến số là bình thường.

Xem xét ví dụ này:

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

Lưu ý rằng các loại vẫn ẩn (nhưng các biến let dành cho tất cả các ý định và mục đích được nhập tĩnh vì chúng không thể được bật lại thành một giá trị mới, trong khi các biến var vẫn có thể được nhập động).

Cuối cùng, tất cả các đối số phương thức sẽ tự động là let, tức là chúng phải ở chế độ chỉ đọc. Nói chung, có một lý do chính đáng để sửa đổi một tham số, ngoại trừ thành ngữ sau:

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

Điều này có thể được thay thế bằng một thành ngữ hơi khác:

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

Khiếu nại chính của tôi là phân luồng, không hoạt động trong nhiều trường hợp (so với Java, C và các trường hợp khác) do khóa trình thông dịch toàn cầu (xem "Inside the Python GIL" (Liên kết PDF) nói chuyện)

Tuy nhiên, có một giao diện đa xử lý rất dễ sử dụng, tuy nhiên việc sử dụng bộ nhớ cho cùng một số tiến trình so với luồng hoặc khó khăn hơn nếu bạn có nhiều dữ liệu được chia sẻ . Tuy nhiên, lợi ích là một khi bạn có một chương trình làm việc với nhiều quy trình, nó có thể mở rộng trên nhiều máy, điều mà một chương trình luồng không thể làm được.

Tôi thực sự không đồng ý với những lời phê bình về tài liệu này, tôi nghĩ nó rất xuất sắc và tốt hơn hầu hết nếu không phải tất cả các ngôn ngữ chính ngoài kia.

Ngoài ra, bạn có thể bắt gặp nhiều lỗi thời gian chạy đang chạy pylint .

44
cmcginty

Có thể cho phép, việc thiếu kiểu gõ tĩnh, có thể đưa ra một số lớp nhất định thời gian chạy lỗi, không xứng đáng với tính linh hoạt bổ sung mà gõ vịt cung cấp.

28
Jacob

Tôi nghĩ rằng các phần hướng đối tượng của Python cảm thấy loại "bắt vít". Toàn bộ nhu cầu truyền "bản thân" cho mọi phương thức là một triệu chứng mà thành phần OOP không rõ ràng đã lên kế hoạch , bạn có thể nói; nó cũng cho thấy các quy tắc phạm vi đôi khi của Python bị chỉ trích trong một câu trả lời khác.

Chỉnh sửa :

Khi tôi nói các bộ phận hướng đối tượng của Python cảm thấy "bị khóa", tôi có nghĩa là đôi khi, phía OOP cảm thấy không nhất quán. Lấy Ruby, ví dụ: Trong Ruby, mọi thứ là một đối tượng và bạn gọi một phương thức bằng cú pháp obj.method Quen thuộc (ngoại trừ các toán tử bị quá tải, của khóa học); trong Python, mọi thứ cũng là một đối tượng, nhưng một số phương thức bạn gọi là hàm; tức là, bạn quá tải __len__ để trả về độ dài, nhưng gọi nó bằng cách sử dụng len(obj) thay vì phổ biến hơn (và nhất quán) obj.length trong các ngôn ngữ khác. Tôi biết có những lý do đằng sau quyết định thiết kế này, nhưng tôi không thích chúng.

Ngoài ra, mô hình OOP của Python không có bất kỳ loại bảo vệ dữ liệu nào, tức là, không có thành viên riêng tư, được bảo vệ và công khai; bạn có thể bắt chước chúng bằng cách sử dụng ___ trước các phương thức, nhưng nó thật là xấu xí. Tương tự, Python không khá có được khía cạnh truyền thông điệp của OOP đúng.

27
mipadi

Những điều tôi không thích về Python:

  1. Threading (Tôi biết nó đã được đề cập, nhưng đáng được đề cập trong mỗi bài viết).
  2. Không hỗ trợ cho các hàm ẩn danh nhiều dòng (lambda chỉ có thể chứa một biểu thức).
  3. Thiếu một hàm/lớp đọc đầu vào đơn giản nhưng mạnh mẽ (như cin hoặc scanf trong C++ và C hoặc Scanner trong Java).
  4. Tất cả các chuỗi không phải là unicode theo mặc định (nhưng được cố định trong Python 3).
19
MAK

Đối số mặc định với các loại dữ liệu có thể thay đổi.

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

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

Nó thường là kết quả của một số lỗi tinh vi. Tôi nghĩ sẽ tốt hơn nếu nó tạo một đối tượng danh sách mới bất cứ khi nào cần một đối số mặc định (thay vì tạo một đối tượng để sử dụng cho mỗi lệnh gọi hàm).

Chỉnh sửa: Đó không phải là một vấn đề lớn, nhưng khi một cái gì đó cần được đề cập trong các tài liệu, nó thường có nghĩa là nó là một vấn đề. Điều này không nên được yêu cầu.

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

Đặc biệt là khi đó nên được mặc định. Đó chỉ là một hành vi kỳ lạ không phù hợp với những gì bạn mong đợi và không hữu ích cho nhiều trường hợp.

18
jsternberg

Một số tính năng của Python làm cho nó trở nên linh hoạt như một ngôn ngữ phát triển cũng được coi là nhược điểm lớn của những thứ được sử dụng cho phân tích tĩnh "toàn bộ chương trình" được thực hiện bởi quá trình biên dịch và liên kết trong các ngôn ngữ như C++ và Java.

  • Khai báo ngầm định các biến cục bộ

Các biến cục bộ được khai báo bằng cách sử dụng câu lệnh gán thông thường. Điều này có nghĩa là các ràng buộc biến trong bất kỳ phạm vi nào khác yêu cầu chú thích rõ ràng được trình biên dịch chọn (khai báo toàn cục và không nhắm mục tiêu cho phạm vi bên ngoài, ký hiệu truy cập thuộc tính cho phạm vi ví dụ). Điều này giúp giảm đáng kể số lượng nồi hơi cần thiết khi lập trình, nhưng có nghĩa là các công cụ phân tích tĩnh của bên thứ ba (như pyflakes) là cần thiết để thực hiện kiểm tra được trình biên dịch xử lý bằng các ngôn ngữ yêu cầu khai báo biến rõ ràng.

  • "Khỉ vá" được hỗ trợ

Nội dung của các mô-đun, các đối tượng lớp và thậm chí không gian tên dựng sẵn có thể được sửa đổi trong thời gian chạy. Điều này là vô cùng mạnh mẽ, cho phép nhiều kỹ thuật cực kỳ hữu ích. Tuy nhiên, tính linh hoạt này có nghĩa là Python không cung cấp một số tính năng phổ biến cho kiểu gõ tĩnh OO ngôn ngữ. Đáng chú ý nhất là tham số "tự" cho các phương thức thể hiện rõ ràng thay vì ngầm định (vì "các phương thức" không phải được định nghĩa trong một lớp, chúng có thể được thêm vào sau bằng cách sửa đổi lớp, nghĩa là nó không thực sự đặc biệt để vượt qua tham chiếu cá thể) và các điều khiển truy cập thuộc tính có thể ' t dễ dàng được thi hành dựa trên việc mã có "bên trong" hay "bên ngoài" lớp hay không (vì sự khác biệt đó chỉ tồn tại trong khi định nghĩa lớp đang được thực thi).

  • Xa kim loại

Điều này cũng đúng với nhiều ngôn ngữ cấp cao khác, nhưng Python có xu hướng trừu tượng hóa hầu hết các chi tiết phần cứng. Các ngôn ngữ lập trình hệ thống như C và C++ vẫn phù hợp hơn nhiều để xử lý truy cập phần cứng trực tiếp (tuy nhiên, Python sẽ khá vui vẻ nói chuyện với những người đó thông qua các mô-đun mở rộng CPython hoặc, rõ ràng hơn, thông qua thư viện ctypes).

14
ncoghlan
  1. Sử dụng thụt lề cho các khối mã thay vì {}/start-end, bất cứ điều gì.
  2. Mọi ngôn ngữ hiện đại mới hơn đều có phạm vi từ vựng phù hợp, nhưng không Python (xem bên dưới).
  3. Tài liệu hỗn loạn (so sánh với tài liệu Perl5, đó là tuyệt vời).
  4. Áo khoác ngoài eo biển (chỉ có một cách để làm điều đó).

Ví dụ cho phạm vi bị hỏng; bảng điểm từ phiên dịch:

>>> 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

globalnonlocal từ khóa đã được giới thiệu để vá lỗi ngu ngốc thiết kế này.

12
zvrba

Tôi tìm thấy sự kết hợp của python của this.method() và thủ tục/hàm method(this) cú pháp rất đáng lo ngại:

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

Điều này đặc biệt tệ vì một số lượng lớn các hàm (chứ không phải các phương thức) chỉ được đổ vào không gian tên toàn cục : các phương thức liên quan đến danh sách, chuỗi, số, hàm tạo, siêu lập trình, tất cả được trộn lẫn trong một lớn danh sách sắp xếp theo thứ tự abc.

Ít nhất, các ngôn ngữ chức năng như F # có tất cả các chức năng được đặt tên đúng trong các mô-đun:

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

Vì vậy, họ không phải là tất cả với nhau. Hơn nữa, đây là một tiêu chuẩn được tuân theo trong toàn bộ thư viện, vì vậy ít nhất nó cũng phù hợp.

Tôi hiểu lý do để thực hiện hàm vs phương thức , nhưng tôi vẫn nghĩ rằng đó là một ý tưởng tồi để trộn chúng như thế này. Tôi sẽ vui hơn nhiều nếu cú ​​pháp phương thức được tuân theo, ít nhất là cho các hoạt động chung:

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

Cho dù các phương thức có đột biến hay không, có chúng là các phương thức trên đối tượng có một số lợi thế:

  • Một nơi duy nhất để tra cứu các hoạt động "phổ biến" trên kiểu dữ liệu: các thư viện khác/v.v. có thể có những thứ ưa thích khác mà chúng có thể làm với các kiểu dữ liệu nhưng các hoạt động "mặc định" đều nằm trong các phương thức của đối tượng.
  • Không cần tiếp tục lặp lại Module khi gọi Module.method(x). Lấy ví dụ về Danh sách chức năng ở trên, tại sao tôi phải tiếp tục nói List nhiều lần? Nó nên biết rằng đó là List và tôi không muốn gọi hàm Navigation.map() trên đó! Sử dụng cú pháp x.map() giữ cho nó DRY và vẫn không rõ ràng.

Và tất nhiên, nó có lợi thế so với cách không gian tên put-every-in-global-tên . Không phải là cách hiện tại là không có khả năng để hoàn thành công việc. Nó thậm chí còn khá ngắn gọn (len(lst)), vì không có gì được đặt tên! Tôi hiểu những lợi thế của việc sử dụng các hàm (hành vi mặc định, v.v.) so với các phương thức, nhưng tôi vẫn không thích nó.

Nó chỉ lộn xộn. Và trong các dự án lớn, sự lộn xộn là kẻ thù tồi tệ nhất của bạn.

11
Haoyi

Thiếu đồng âm .

Python phải đợi 3.x để thêm từ khóa "với". Trong bất kỳ ngôn ngữ đồng âm nào, nó có thể được thêm vào trong thư viện.

Hầu hết các vấn đề khác tôi đã thấy trong các câu trả lời là một trong 3 loại:

1) Những thứ có thể được sửa bằng công cụ (ví dụ: pyflakes) 2) Chi tiết triển khai (GIL, hiệu suất) 3) Những thứ có thể được sửa bằng các tiêu chuẩn mã hóa (nghĩa là mọi người muốn ở đó)

# 2 không phải là vấn đề với ngôn ngữ, IMO # 1 và # 3 không phải là vấn đề nghiêm trọng.

8
Jason

Python là ngôn ngữ yêu thích của tôi vì nó rất biểu cảm, nhưng vẫn khiến bạn không mắc quá nhiều lỗi. Tôi vẫn còn một vài điều làm tôi khó chịu:

  • Không có chức năng ẩn danh thực sự. Lambda có thể được sử dụng cho các hàm câu lệnh đơn và câu lệnh with có thể được sử dụng cho nhiều thứ mà bạn sử dụng khối mã trong Ruby. Nhưng trong một số tình huống, nó làm cho mọi thứ trở nên vụng về hơn một chút so với họ. (Khác xa với sự vụng về như trong Java, nhưng vẫn ...)

  • Một số nhầm lẫn trong mối quan hệ giữa các mô-đun và các tập tin. Chạy "python foo.py" từ dòng lệnh khác với "nhập foo". Nhập khẩu tương đối trong Python 2.x cũng có thể gây ra sự cố. Tuy nhiên, các mô-đun của Python tốt hơn nhiều so với các tính năng tương ứng của C, C++ và Ruby.

  • Rõ ràng self. Mặc dù tôi hiểu một số lý do cho nó và mặc dù tôi sử dụng Python hàng ngày, tôi có xu hướng phạm sai lầm khi quên nó. Một vấn đề khác là nó trở nên hơi tẻ nhạt tạo một lớp từ một mô-đun. Tự rõ ràng có liên quan đến phạm vi giới hạn mà người khác đã phàn nàn. Phạm vi nhỏ nhất trong Python là phạm vi chức năng. nên, đó không phải là vấn đề của chính nó và IMO thường cung cấp mã sạch hơn.

  • Một số chức năng toàn cầu, chẳng hạn như len, mà bạn mong đợi là một phương thức (mà nó thực sự nằm ở phía sau hậu trường).

  • Lõm đáng kể. Không phải ý tưởng, mà tôi nghĩ là tuyệt vời, nhưng vì đây là điều duy nhất khiến nhiều người không dùng thử Python, có lẽ Python sẽ tốt hơn với một số bắt đầu/kết thúc (tùy chọn) bỏ qua những người đó, tôi hoàn toàn có thể sống với một kích thước được thi hành cho vết lõm quá.

  • Rằng nó không phải là ngôn ngữ tích hợp của trình duyệt web, thay vì JavaScript.

Trong số những khiếu nại này, đây chỉ là lần đầu tiên tôi quan tâm đầy đủ đến mức tôi nghĩ rằng nó nên được thêm vào ngôn ngữ. Những cái khác là khá nhỏ, ngoại trừ cái cuối cùng, sẽ rất tuyệt nếu nó xảy ra!

7
Martin Vilcans

Python chưa hoàn toàn trưởng thành: ngôn ngữ python 3.2 tại thời điểm này có vấn đề tương thích với hầu hết các gói hiện được phân phối (thông thường chúng tương thích với python 2.5). Đây là một nhược điểm lớn hiện đang đòi hỏi nhiều nỗ lực phát triển hơn (tìm gói cần thiết; xác minh tính tương thích; cân nhắc chọn gói không tốt có thể tương thích hơn; đưa phiên bản tốt nhất, cập nhật lên 3.2 có thể mất vài ngày; bắt đầu làm một cái gì đó hữu ích).

Có khả năng vào giữa năm 2012, điều này sẽ ít trở ngại hơn.

Lưu ý rằng tôi đoán rằng tôi đã bị hạ bệ bởi một fan-boy. Trong cuộc thảo luận về nhà phát triển, nhóm phát triển cấp cao của chúng tôi đã đưa ra kết luận tương tự.

Trưởng thành theo một nghĩa chính có nghĩa là một nhóm có thể sử dụng công nghệ và rất nhanh chóng và chạy mà không gặp rủi ro tiềm ẩn (bao gồm các vấn đề tương thích). Bên thứ 3 python gói và nhiều ứng dụng không hoạt động theo 3.2 cho phần lớn các gói ngày nay. Điều này tạo ra nhiều công việc tích hợp, thử nghiệm, tự thực hiện lại công nghệ thay vì giải quyết vấn đề trong tay == công nghệ kém trưởng thành hơn.

Cập nhật cho tháng 6 năm 2013: Python 3 vẫn có vấn đề về thời gian đáo hạn. Thường thì một thành viên trong nhóm sẽ đề cập đến một gói cần thiết sau đó nói "ngoại trừ nó chỉ dành cho 2.6" (trong một số trường hợp này, tôi đã triển khai một cách giải quyết thông qua ổ cắm localhost để sử dụng gói chỉ 2.6 với 2.6 và phần còn lại của công cụ của chúng tôi ở lại với 3.2). Ngay cả MoinMoin, wiki python thuần, được viết bằng Python 3.

5
Jonathan Cline IEEE

Phạm vi của Python bị phá vỡ nghiêm trọng, điều này làm cho lập trình hướng đối tượng trong Python rất khó xử.

4
Mason Wheeler

Công cụ sửa đổi truy cập trong Python không thể thi hành - gây khó khăn cho việc viết mã được cấu trúc tốt, được mô đun hóa.

Tôi cho rằng đó là một phần của phạm vi bị phá vỡ của @ Mason - một vấn đề lớn nói chung với ngôn ngữ này. Đối với mã được cho là có thể đọc được, có vẻ khá khó khăn để tìm ra những gì có thể và nên có trong phạm vi và giá trị sẽ ở bất kỳ thời điểm nào - tôi hiện đang nghĩ đến việc chuyển từ Python ngôn ngữ vì những hạn chế này.

Chỉ vì "tất cả chúng ta đều là người lớn đồng ý" không có nghĩa là chúng ta không phạm sai lầm và không làm việc tốt hơn trong một cấu trúc mạnh mẽ, đặc biệt là khi làm việc trong các dự án phức tạp - thụt đầu dòng và dấu gạch dưới vô nghĩa dường như không đủ .

4
Vector

Tôi hiểu về Python:

  • Bolted-on OOP (Xem câu trả lời của @ mipadi để biết thêm chi tiết về điều này)
  • Thực hiện hỏng của lambdas
  • Vấn đề phạm vi
  • Không có bộ sưu tập liên tục trong thư viện tiêu chuẩn
  • Khả năng đáp ứng kém đối với DSL nhúng
4
missingfaktor

Nhiều công văn không tích hợp tốt với hệ thống loại công văn đơn được thiết lập và không hiệu quả lắm.

Tải động là một vấn đề lớn trên các hệ thống tệp song song trong đó ngữ nghĩa giống POSIX dẫn đến sự chậm chạp thảm khốc cho các hoạt động chuyên sâu về siêu dữ liệu. Tôi có các đồng nghiệp đã đốt cháy một phần tư triệu giờ lõi chỉ nhận được Python (với numpy, mpi4py, petc4py và các mô-đun mở rộng khác) được tải trên lõi 65k. (Mô phỏng đã mang đến một khoa học mới đáng kể kết quả, vì vậy nó đáng giá, nhưng nó là một vấn đề khi hơn một thùng dầu bị đốt cháy để tải Python một lần.) Không thể liên kết tĩnh đã buộc chúng tôi phải đi đến những sự đối nghịch lớn có được thời gian tải hợp lý ở quy mô, bao gồm vá libc-rtld để thực hiện dlopen thực hiện truy cập hệ thống tệp tập thể.

3
Jed
  • khá nhiều thư viện và phần mềm bên thứ 3 rất chính thống được sử dụng rộng rãi, hoàn toàn không phải là Pythonic. Một vài ví dụ: Soaplib, opensp, reportlab. Phê bình nằm ngoài phạm vi, nó ở đó, nó được sử dụng rộng rãi, nhưng nó làm cho văn hóa python khó hiểu (nó làm tổn thương phương châm nói rằng "Nên có một - và tốt nhất là chỉ có một - cách dễ hiểu để làm điều đó "). Những thành công được biết đến của Pythonic (chẳng hạn như Django hoặc trac) dường như là ngoại lệ.
  • độ sâu không giới hạn của khả năng trừu tượng của thể hiện, lớp, siêu dữ liệu là khái niệm đẹp và độc đáo. Nhưng để thành thạo nó, bạn phải biết sâu về trình thông dịch (theo thứ tự python được diễn giải, v.v.). Nó không được biết đến và sử dụng rộng rãi (hoặc được sử dụng chính xác), trong khi ma thuật đen tương tự như vậy như chung chung C #, đó là khái niệm phức tạp hơn (IMHO) dường như được biết đến và sử dụng rộng rãi hơn, theo tỷ lệ.
  • để nắm bắt tốt bộ nhớ và mô hình luồng, bạn phải khá có kinh nghiệm với python, vì không có thông số kỹ thuật toàn diện. Bạn chỉ cần biết những gì hoạt động, có thể bởi vì bạn đọc các nguồn của thông dịch viên hoặc những người kỳ quặc có kinh nghiệm và phát hiện ra cách khắc phục chúng. Chẳng hạn, chỉ có các tham chiếu mạnh hay yếu, không phải là các giới thiệu mềm và ảo của Java. Java có một luồng cho bộ sưu tập rác trong khi không có câu trả lời chính thức về thời điểm thu gom rác xảy ra trong python; bạn chỉ có thể quan sát rằng bộ sưu tập rác không xảy ra if no python được thực thi và kết luận đôi khi có thể xảy ra khi cố gắng cấp phát bộ nhớ. Có thể khó khăn khi bạn không biết tại sao tài nguyên bị khóa không được phát hành (kinh nghiệm của tôi về điều đó là mod_python trong freeswitch).

Dù sao đi nữa, python là ngôn ngữ chính của tôi trong 4 năm nay. Trở thành fanboy, elitists hoặc monomaniacs không phải là một phần của văn hóa python.

3
vincent

Tôi ủng hộ python và nhược điểm đầu tiên xuất hiện trong đầu tôi là khi bình luận một câu như if myTest(): thì bạn phải thay đổi thụt lề của toàn bộ khối thực thi mà bạn sẽ Không phải làm với C hoặc Java. Thực tế là trong python thay vì nhận xét một mệnh đề if thay vì tôi đã bắt đầu nhận xét theo cách này: `if True: #myTest ( ) vì vậy tôi cũng sẽ không phải thay đổi khối mã sau. Vì Java và C không dựa vào thụt lề nên việc nhận xét các câu lệnh dễ dàng hơn với C và Java.

3
Niklas
  1. Hiệu suất không tốt, nhưng được cải thiện với pypy,
  2. GIL ngăn chặn việc sử dụng luồng để tăng tốc mã, (mặc dù điều này thường là tối ưu hóa sớm),
  3. Nó chỉ hữu ích cho lập trình ứng dụng,

Nhưng nó có một số tính năng đổi thưởng tuyệt vời:

  1. Nó hoàn hảo cho RAD,
  2. Thật dễ dàng để giao tiếp với C (và để C nhúng a python),
  3. Nó rất dễ đọc,
  4. Thật dễ để học
  5. Nó được ghi chép lại,
  6. Pin thực sự được bao gồm, thư viện tiêu chuẩn của nó rất lớn và pypi chứa các mô-đun cho tất cả mọi thứ,
  7. Nó có một cộng đồng lành mạnh.
3
dan_waterworth
  • OOP lạ: [.__.]
    • len(s) thông qua __len__(self) và các "phương thức đặc biệt" khác
    • các phương thức đặc biệt khác có thể được bắt nguồn từ các phương thức đặc biệt khác (__add____iadd__ cho ++=)
    • self là tham số phương thức đầu tiên
    • bạn có thể quên gọi hàm tạo của lớp cơ sở
    • không có sửa đổi truy cập (riêng tư, được bảo vệ ...)
  • không có định nghĩa không đổi
  • không có bất biến cho các loại tùy chỉnh
  • GIL
  • hiệu suất kém dẫn đến sự pha trộn của Python và C và các rắc rối với bản dựng (tìm kiếm C libs, phụ thuộc nền tảng ...)
  • tài liệu xấu, đặc biệt là trong libs của bên thứ ba
  • không tương thích giữa Python 2.x và 3.x
  • các công cụ phân tích mã kém (so với những gì được cung cấp cho các ngôn ngữ được nhập tĩnh như Java hoặc C #)
2
deamon

Tôi muốn có các cấu trúc song song rõ ràng. Thường xuyên hơn không, khi tôi viết một danh sách hiểu

[ f(x) for x in lots_of_sx ]

Tôi không quan tâm thứ tự các yếu tố sẽ được xử lý. Đôi khi, tôi thậm chí không quan tâm đến thứ tự chúng được trả lại.

Ngay cả khi CPython không thể làm tốt khi f của tôi là Python thuần túy, hành vi như thế này có thể được xác định cho các triển khai khác sử dụng.

0
rbanffy

Python không tối ưu hóa cuộc gọi đuôi, chủ yếu là cho lý do triết học . Điều này có nghĩa là việc đệ quy đuôi trên các cấu trúc lớn có thể tốn O(n) bộ nhớ (vì ngăn xếp không cần thiết được giữ) và sẽ yêu cầu bạn viết lại đệ quy dưới dạng vòng lặp để có được O(1) bộ nhớ.

0
a3nm