Khi nào Python thêm gợi ý loại?

Tôi là nhà nghiên cứu và phát triển web tự do đến từ Malawi. Tôi thích học những điều mới và việc viết lách giúp tôi hiểu và củng cố các khái niệm. Tôi hy vọng bằng cách chia sẻ kinh nghiệm của mình, những người khác có thể học được điều gì đó từ họ

Mức độ phổ biến của gợi ý nhập đang gia tăng trong cộng đồng Python. Điều này sẽ dẫn chúng ta đến đâu?

con trăn. Gợi ý sử dụng gợi ý loại có thực sự hữu ích không?

Tất cả các Pythonistas đều biết rằng trong một vài năm, gợi ý kiểu của Python đã nhanh chóng trở nên phổ biến. Nó bắt đầu trở lại trong Python 3. 5 và kể từ đó, chức năng này ngày càng có nhiều loại và chức năng hơn, và— trong Python 3. 10 — ngay cả một toán tử mới, |. May mắn thay, toán tử này có ý nghĩa tương tự như toán tử được sử dụng cho các tập hợp

Tôi đã nghe nhiều ý kiến ​​khác nhau về gợi ý loại, từ giận dữ và thù hận đến tình yêu và sự tận tâm. Hầu hết các tác giả viết về gợi ý kiểu trong Python đều coi chúng là hữu ích, điều gì đó giúp tăng khả năng đọc mã, đặc biệt trong trường hợp cơ sở mã lớn. Tuy nhiên, khi làm như vậy, chúng thường hiển thị các ví dụ rất đơn giản về gợi ý loại.

Mặc dù gợi ý kiểu cho phép một người sử dụng trình kiểm tra kiểu tĩnh, nhưng chúng tôi sẽ không thảo luận về chủ đề này trong bài viết này. Tôi sẽ chỉ thừa nhận rằng việc kiểm tra tĩnh như vậy thực sự có thể là một công cụ hữu ích. Ở đây, chúng ta sẽ thảo luận về một chủ đề gây tranh cãi hơn một chút, đó là liệu gợi ý loại có hữu ích hay không. Một số người coi điều này là đương nhiên, nhưng tôi thì không. Tôi muốn xem bằng chứng. Giống như hầu hết mọi thứ, quá nhiều điều tốt có thể trở nên tồi tệ. Có phải như vậy với gợi ý kiểu Python không?

Loại gợi ý có nhiều người ủng hộ. Một số giới hạn bản thân để nói rằng đó là một công cụ cực kỳ hữu ích. Những người khác cho rằng bạn cần sử dụng gợi ý kiểu vì không có chúng, mã Python rất khó đọc, nếu không muốn nói là khó hiểu

Vì lợi ích của cuộc thảo luận, tôi muốn yêu cầu bạn giữ cho tâm trí của bạn cởi mở. Hiện tại, đừng coi thường những lợi thế của gợi ý loại. Thay vào đó, hãy cố gắng phân tích chúng để tìm ra ưu và nhược điểm của chúng.

Bây giờ, với tâm trí cởi mở, chúng ta hãy bắt đầu cuộc thảo luận về cách sử dụng gợi ý loại trong Python, tập trung vào các câu hỏi sau. Chúng có hữu ích như chúng ta vẫn thường nghe không?

Thay vì Giới thiệu về Gợi ý Loại

Tôi sẽ không giải thích các gợi ý về loại, vì điều này sẽ làm cho bài viết này quá dài. Bên cạnh đó, chúng đã được mô tả ở nhiều nguồn khác nhau, cả ở đây trên Medium [e. g. , đây, đây, hoặc đây]. Trong ấn bản thứ 2 của Fluent Python, Luciano Ramalho giới thiệu khá chi tiết. Bạn có thể thấy các gợi ý về loại đang hoạt động trong nhiều cuốn sách. Ví dụ, trong Steven F. Lập trình Python chức năng của Lott [cũng là phiên bản thứ 2]

Gợi ý loại phục vụ ba mục đích chính. nó cho phép bạn chạy các trình kiểm tra tĩnh trên mã của bạn; . Hãy xem xét một vài ví dụ. Chỉ cần phân tích chữ ký của các hàm là đủ, đó là nơi bao gồm các gợi ý về loại

Trước khi tiếp tục, hãy đọc đoạn mã dưới đây và cố gắng xem càng nhiều càng tốt từ chữ ký của các chức năng

Bây giờ, hãy nói về các chức năng này

  • parse_text[]. Nó nhận một văn bản [dưới dạng một chuỗi] và sau khi phân tích cú pháp bằng cách nào đó, nó sẽ trả về một chuỗi đã phân tích cú pháp. Chắc chắn, chúng tôi không biết phân tích cú pháp này có nghĩa là gì ở đây, nhưng điều này sẽ dễ hiểu từ thân hàm. Chữ ký này rất dễ hiểu
  • gdu[]. Hừm… Không biết. Chữ ký này là một cơn ác mộng
  • report_bug[]. Rõ ràng, chức năng nhằm mục đích báo cáo lỗi. Lỗi được thông qua dưới dạng một chuỗi. reporter có thể là ai đó/thứ gì đó báo cáo lỗi, được đưa ra dưới dạng một chuỗi, với giá trị mặc định được cung cấp bởi một biến toàn cục DEFAULT_REPORTER. report_to là vị trí mà lỗi sẽ được báo cáo, cũng được đưa ra dưới dạng một chuỗi, cũng với giá trị mặc định được cung cấp bởi một biến toàn cục [DEFAULT_REPORT_TO].
    Hàm trả về giá trị Boolean; . Mặc dù phức tạp hơn các gợi ý kiểu parse_text[], nhưng chúng cũng khá đơn giản.
  • measure_distance[]. Chúng tôi biết chức năng đo khoảng cách và trả về nó dưới dạng float. Tuy nhiên, chúng tôi không biết phao này đại diện cho đơn vị nào. Khoảng cách là từ vị trí này đến vị trí khác và vì chúng được cung cấp dưới dạng bộ dữ liệu của hai số float, nên chúng có thể là tọa độ địa lý. Chữ ký này gợi ý những gì chức năng làm, nhưng nó có thể dễ đọc hơn

Chắc chắn, hiếm khi chúng ta có thể tìm hiểu mọi thứ về chức năng làm gì chỉ bằng cách đọc chữ ký của nó. Nhưng nếu chữ ký tốt, chúng ta có thể học được khá nhiều điều mà không cần nhìn vào phần thân của hàm. Nhưng khi nó lộn xộn như trong gdu[], gợi ý gõ không những không giúp được gì mà thậm chí còn có thể gây thêm trở ngại, chỉ làm chúng ta đau đầu hơn

Tất nhiên, trong gdu[], vấn đề không chỉ nằm ở các gợi ý loại phức tạp;

Có nhiều cách để cải thiện khả năng đọc. Nhìn lại một lần nữa vào measure_distance[]. Chữ ký của nó không truyền đạt được hai điều. đơn vị đo lường là gì [km, mét, dặm hoặc các đơn vị số liệu khác]; . Chúng tôi có thể cải thiện gợi ý loại để cung cấp cho người dùng hai mẩu thông tin này không?

Trên thực tế, chúng ta có thể. Đây là nơi bí danh loại [mà đôi khi tôi gọi là loại tùy chỉnh] có thể giúp ích rất nhiều

Chữ ký này nói lên những gì chúng tôi đã bỏ lỡ trước đây và nó làm được như vậy nhờ nhập bí danh parse_text[]3 và parse_text[]4. vị trí là tọa độ địa lý và khoảng cách được đo bằng km

Thông thường, sẽ tốt hơn nếu sử dụng cấu trúc dữ liệu thực tế thay vì bí danh loại

Ở đây, parse_text[]4 là cấu trúc dữ liệu parse_text[]6, không phải là bí danh kiểu. Bạn nên sử dụng cách tiếp cận nào? . Vì cả hai đều dễ hiểu như nhau, hãy quyết định dựa trên việc bạn có sử dụng cấu trúc dữ liệu cho các mục đích khác nhau hay không. Ở đây, nó sẽ được sử dụng làm nơi chứa các vị trí thực tế; . Nếu không, hãy tìm một bí danh loại

Nhớ lại

Khi tạo bí danh loại, việc đặt tên có tầm quan trọng quan trọng. Sử dụng tên có ý nghĩa, giống như cách bạn làm khi tạo cấu trúc dữ liệu tùy chỉnh

Vì vậy, Gõ gợi ý có thể hữu ích như thế nào?

Gợi ý nhập có thể giúp tăng khả năng đọc, như các chức năng parse_text[], report_bug[]measure_distance[] đã hiển thị. Đôi khi một chữ ký với gợi ý loại thông tin là đủ để người đọc hiểu chức năng đó làm gì

Xin lỗi, cái gì? . Bạn đã đúng khi chỉ ra nó như một phản ví dụ. Hãy nhớ lại chữ ký của gdu[] và viết lại nó mà không cần gõ gợi ý

Cả hai phiên bản đều không thể đọc được, vì một lý do duy nhất. tên vô nghĩa của chính hàm và đối số của nó. Những gợi ý loại này không giúp giải thích chức năng của hàm này, nhưng chúng có thể làm bạn đau đầu hơn

Trong những trường hợp hiếm gặp, gợi ý loại có thể tăng khả năng đọc chữ ký của hàm khi cách đặt tên kém. Tuy nhiên, trước khi nghĩ đến việc sử dụng gợi ý loại để cải thiện khả năng đọc, hãy xem xét lại cách đặt tên. Sử dụng tên rõ ràng và nhiều thông tin, sau đó mới sử dụng gợi ý loại để tăng khả năng đọc của hàm hơn nữa

Như bạn thấy, bản thân các loại, không có bất kỳ thứ gì khác, cũng thường vô nghĩa. Chúng tôi biết rằng gdu[]2 là một hàm có thể gọi được lấy một chuỗi và trả về một chuỗi, nhưng điều đó không có nhiều ý nghĩa. Do đó, kết luận quan trọng đầu tiên của chúng tôi

Nhập gợi ý chỉ hoạt động với cách đặt tên tốt. Nếu không đặt tên tốt, sẽ không có gì giúp tăng khả năng đọc mã, kể cả gợi ý kiểu

Một số nhà phát triển phát điên với các gợi ý kiểu Python. Ảnh của tác giả

Ngay cả khi đặt tên tốt được sử dụng, gợi ý kiểu có thể làm cho chữ ký của hàm khó đọc và khó hiểu. Nhìn vào ví dụ sau [nguồn]

từ chối trách nhiệm. Đây là một ví dụ về gợi ý kiểu trong Python và nó không đi ngược lại các quy tắc. Tôi không muốn chỉ trích mã cụ thể này, nhưng để chỉ ra những gì tôi không thích trong một số cách sử dụng gợi ý kiểu

Bây giờ, hãy loại bỏ hoàn toàn gợi ý loại

Vì chúng tôi không có gợi ý loại cho gdu[]3, tôi đã đổi tên thành gdu[]4, để nó có nghĩa. gdu[]5 là một triển khai đơn giản của đơn nguyên gdu[]6. So sánh mã có chú thích và không có chú thích. Bạn có nghĩ rằng cái trước dễ đọc và dễ hiểu hơn cái sau không?

Không có gợi ý về loại, thật dễ dàng để thấy rằng gdu[]5 lấy một đối số có thể gọi được;

Tôi đồng ý rằng những người dùng Python mới bắt đầu có thể gặp vấn đề khi xem tất cả những điều này. Nhưng bạn có nghĩ rằng gợi ý loại sẽ giúp họ nhìn thấy tất cả điều này? . report_bug[]1

Với ví dụ này, tôi muốn chỉ ra rằng đôi khi các gợi ý gõ khiến mã trở nên phức tạp không cần thiết. Vì vậy, hầu hết thời gian, tôi thích một giải pháp ở giữa, một giải pháp trong đó gợi ý loại được cung cấp một cách hợp lý [dễ hiểu]. Điều này có nghĩa là tránh các gợi ý kiểu quá phức tạp

Tất nhiên, đó là vấn đề sở thích, nhưng tôi sợ phải làm việc với mã chứa đầy các gợi ý kiểu dài và phức tạp. Tôi sử dụng các gợi ý loại, nhưng tôi thích những gợi ý đơn giản hơn, giống như những gợi ý trong một số ví dụ ở trên, chẳng hạn như parse_text[], report_bug[] và hơn hết là measure_distance[]

Gợi ý loại khó không làm cho mã dễ hiểu hơn; . Đây là lý do tại sao tôi không bị thuyết phục bởi các câu lệnh đơn thuần kiểu gợi ý làm tăng khả năng đọc mã Python. Tôi có thể đồng ý rằng gợi ý kiểu dễ hiểu làm tăng khả năng đọc mã. Tuy nhiên, khi thực hành, nhiều gợi ý về loại mà tôi thấy không thể hiểu được.

Tôi đoán rằng các lập trình viên viết mã rõ ràng sẽ có khả năng cải thiện nó bằng cách sử dụng các gợi ý về loại. Đồng thời, nhập gợi ý vào tay những người viết mã không rõ ràng thậm chí có thể làm giảm khả năng đọc mã

Điều này gợi ý rằng cách tốt nhất để sử dụng gợi ý kiểu hiệu quả là học cách viết mã sạch. Những kỹ năng như vậy sẽ mang lại cho bạn khả năng sử dụng gợi ý loại hiệu quả và dễ đọc

Trước khi kết luận, tôi muốn nhấn mạnh rằng tôi thích gõ tĩnh. Tôi đã sử dụng nó trong C và Go, cũng như trong Cython. Trong cả ba trường hợp này, tôi rất thích sử dụng kiểu gõ tĩnh và tôi thấy nó hữu ích. Nhưng chúng ta không được quên rằng gợi ý kiểu không phải là kiểu gõ tĩnh;

Sự kết luận

Gợi ý kiểu của Python không phải là một khái niệm mới nữa, nhưng nó vẫn đang phát triển. Ý kiến ​​​​cá nhân của tôi là mặc dù không cần thiết nhưng các gợi ý nhập có thể hữu ích, đôi khi khá nhiều. Nhưng tôi sợ điều gì sẽ đến. Tôi sợ rằng tôi sẽ phải viết report_bug[]5 thay vì report_bug[]6 mặc dù theo định nghĩa, report_bug[]7 có nghĩa là chúng có thể là bất cứ thứ gì. Và tôi sợ vì ngày càng thấy nhiều gợi ý kiểu khó hiểu

Trong nhiều năm, Python đã được coi là một ngôn ngữ tuyệt vời nhờ cú pháp dễ hiểu của nó. Liệu nó vẫn xứng đáng với ý kiến ​​​​này?

Dưới đây là một số quy tắc tôi sử dụng để làm cho gợi ý loại dễ hiểu

  1. Sử dụng gợi ý kiểu thô — nghĩa là xác định chúng trực tiếp bên trong chữ ký — khi chúng đơn giản và thực sự dễ hiểu. Khi một đối số có kiểu thực sự phức tạp, bạn có thể [i] đơn giản hóa gợi ý kiểu của nó [e. g. , report_bug[]8 thay vì report_bug[]9], [ii] sử dụng gợi ý bí danh loại hoặc [iii] tạo cấu trúc dữ liệu tùy chỉnh mà bạn có thể sử dụng làm gợi ý loại. [Đối với [ii] và [iii], xem điểm 2 và 3 bên dưới. ]
  2. Khi bạn có thể sử dụng một cấu trúc dữ liệu [e. g. , một bộ được đặt tên, lớp dữ liệu hoặc lớp] thay vì gợi ý loại tương ứng, hãy làm điều đó. Điều này tập trung vào các tình huống mà bạn thực sự có thể sử dụng cấu trúc dữ liệu này trong mã của mình
  3. Bất cứ khi nào bạn cần gợi ý kiểu phức tạp nhưng không cần cấu trúc dữ liệu tương ứng, hãy xác định bí danh kiểu tương ứng [kiểu tùy chỉnh]. Làm điều đó bên ngoài chữ ký của hàm/phương thức và sử dụng một tên có ý nghĩa. Khi một mô-đun hoặc gói chứa nhiều bí danh loại, bạn có thể đặt chúng trong một mô-đun chuyên dụng [e. g. , reporter0]
  4. Làm theo các quy tắc trên có thể khiến reporter1 không hài lòng. Tuy nhiên điều này sẽ gây tranh cãi, tôi không quan tâm. Đối với tôi, khả năng đọc mã quan trọng hơn là làm cho reporter1 hài lòng

Đó là tất cả trong tay của chúng tôi. Danh tiếng của Python đang bị đe dọa. Chúng ta có thể biến gợi ý kiểu thành một chức năng hữu ích giúp mã Python dễ đọc hơn. Nhưng nếu chúng ta không đủ cẩn thận, nếu chúng ta làm theo những gợi ý điên rồ hơn. -more-loại-gợi ý. khái niệm, có thể Python sẽ xuống cấp từ từ nhưng đều đặn. Và trong mười năm nữa [có thể sớm hoặc muộn hơn một chút] nó sẽ trở thành một ngôn ngữ lập trình khó hiểu mà không ai muốn sử dụng do cú pháp vụng về và vụng về của nó

Dù sao cũng chưa muộn. tất cả chúng ta có thể làm một cái gì đó về nó. Điều đơn giản nhất chúng ta có thể làm là sử dụng gợi ý loại một cách khôn ngoan. Nếu bạn đồng ý với tôi, từ giờ trở đi, hãy kiểm tra kỹ tất cả các gợi ý loại trong mã Python và sửa lại mọi thứ có vẻ không rõ ràng hoặc mơ hồ

Cảm ơn vì đã tham gia cùng tôi trong cuộc thảo luận chắc chắn gây tranh cãi này. Tôi chắc rằng nhiều bạn không đồng ý với tôi. Đồng thời, tôi hy vọng một số bạn chia sẻ ý kiến ​​​​của tôi, và ai biết được, có lẽ tôi đã thành công trong việc thuyết phục một số bạn rằng chúng ta nên cẩn thận khi sử dụng các gợi ý loại?

Python có gợi ý kiểu không?

Với Python 3. 5, gợi ý nhập đã chính thức trở thành một phần của ngôn ngữ [PEP 484]. Sử dụng công cụ kiểm tra mã hoặc kẻ nói dối, nhà phát triển có thể kiểm tra tính nhất quán của các biến và loại của chúng trên cơ sở mã và thực hiện các phân tích mã tĩnh mà trước đây khó hoặc không thể thực hiện được.

Python có thực thi các gợi ý kiểu không?

Python sẽ luôn là ngôn ngữ được gõ động. Tuy nhiên, PEP 484 đã giới thiệu các gợi ý về kiểu, cho phép thực hiện kiểm tra kiểu tĩnh của mã Python. Không giống như cách thức hoạt động của các loại trong hầu hết các ngôn ngữ nhập tĩnh khác, bản thân các gợi ý nhập không khiến Python thực thi các loại .

Điểm gợi ý kiểu trong Python là gì?

Gợi ý nhập cải thiện IDE và linters . Chúng làm cho việc lập luận tĩnh về mã của bạn trở nên dễ dàng hơn nhiều. Nhập gợi ý giúp bạn xây dựng và duy trì kiến ​​trúc sạch hơn. Hành động viết các gợi ý về loại buộc bạn phải suy nghĩ về các loại trong chương trình của mình.

Gợi ý loại Python có cải thiện hiệu suất không?

Nếu bạn muốn viết mã python hiện đại và tăng chất lượng mã của mình, hãy nhập gợi ý. Tuy nhiên, có lẽ bạn nên tránh thêm gợi ý loại nếu bạn sử dụng phiên bản cũ của Python, nếu bạn chưa quen với ngôn ngữ lập trình hoặc nếu hiệu suất là một vấn đề thực sự.

Chủ Đề