Hacker News

So sánh trình kiểm tra loại Python: Suy luận vùng chứa trống

So sánh cách mypy, pyright và các trình kiểm tra kiểu Python khác xử lý suy luận vùng chứa trống. Tìm hiểu các cách khắc phục thực tế cho các trường hợp khó gõ dần dần trong các cơ sở mã lớn.

11 đọc tối thiểu

Mewayz Team

Editorial Team

Hacker News

Tại sao các thùng chứa trống phá vỡ trình kiểm tra loại Python - và bạn có thể làm gì với nó

Hệ thống gõ dần dần của Python đã trưởng thành đáng kể kể từ khi PEP 484 giới thiệu gợi ý kiểu vào năm 2015. Ngày nay, hàng triệu nhà phát triển dựa vào trình kiểm tra kiểu tĩnh để phát hiện lỗi trước khi chúng được đưa vào sản xuất. Nhưng có một góc tinh tế, khó chịu của hệ thống phân loại vẫn khiến ngay cả những kỹ sư giàu kinh nghiệm cũng phải bối rối: thùng rỗng có loại nào? Khi bạn viết x = [] mà không có chú thích, trình kiểm tra loại của bạn phải đoán - và những trình kiểm tra khác nhau sẽ đoán theo cách khác. Sự khác biệt này tạo ra những vấn đề thực sự cho các nhóm duy trì cơ sở mã lớn, trong đó việc chuyển đổi hoặc kết hợp các trình kiểm tra loại có thể gây ra hàng trăm lỗi không mong muốn chỉ sau một đêm.

Bài viết này phân tích cách bốn trình kiểm tra loại Python chính — mypy, pyright, pytype và pyre — xử lý suy luận vùng chứa trống, lý do chúng không đồng ý và những chiến lược thực tế nào bạn có thể áp dụng để viết Python an toàn loại bất kể lựa chọn công cụ của bạn là gì.

Vấn đề cốt lõi: Các thùng chứa rỗng vốn rất mơ hồ

Hãy xem xét dòng Python vô hại này: results = []. Kết quả có phải là danh sách [int] không? Một danh sách[str]? Một danh sách[dict[str, Any]]? Nếu không có bối cảnh bổ sung, thực sự không có cách nào để biết. Thời gian chạy Python không quan tâm - về bản chất, các danh sách không đồng nhất - nhưng trình kiểm tra kiểu tĩnh cần chỉ định một loại cụ thể cho mọi biến để thực hiện công việc của chúng. Điều này tạo ra sự căng thẳng cơ bản giữa tính linh hoạt động của Python và sự đảm bảo mà phân tích tĩnh cố gắng cung cấp.

Vấn đề phức tạp với từ điển và bộ. Một {} trống thực sự được phân tích cú pháp dưới dạng một lệnh chứ không phải một tập hợp, điều này làm tăng thêm sự mơ hồ về cú pháp bên cạnh sự mơ hồ ở cấp độ loại. Và các vùng chứa lồng nhau - hãy nghĩ defaultdict(list) hoặc results = {k: [] for k in Keys} - đẩy các công cụ suy luận đến giới hạn của chúng. Mỗi trình kiểm tra loại đã phát triển phương pháp phỏng đoán riêng và sự khác biệt có ý nghĩa hơn hầu hết các nhà phát triển nhận ra.

Trong các hệ thống sản xuất xử lý khối lượng công việc thực tế — cho dù đó là CRM xử lý hồ sơ khách hàng, mô-đun lập hóa đơn tạo chi tiết đơn hàng hay chỉ số tổng hợp quy trình phân tích — các vùng chứa trống xuất hiện liên tục dưới dạng mẫu khởi tạo. Việc hiểu sai loại không chỉ tạo ra các cảnh báo nói dối; nó có thể che giấu các lỗi thực sự xảy ra trong thời gian chạy.

Mypy: Suy luận trì hoãn với bất kỳ tiềm ẩn nào

💡 BẠN CÓ BIẾT?

Mewayz replaces 8+ business tools in one platform

CRM · Hóa đơn · Nhân sự · Dự án · Đặt chỗ · Thương mại điện tử · POS · Phân tích. Gói miễn phí vĩnh viễn có sẵn.

Bắt đầu miễn phí →

Mypy, trình kiểm tra loại Python lâu đời nhất và được áp dụng rộng rãi nhất, có cách tiếp cận tương đối nhẹ nhàng đối với các vùng chứa trống. Khi gặp x = [] ở phạm vi hàm, nó cố gắng trì hoãn việc quyết định loại và suy ra loại phần tử từ lần sử dụng tiếp theo. Nếu bạn viết x = [] theo sau là x.append(42), mypy sẽ suy ra list[int]. Chiến lược "tham gia" này hoạt động hiệu quả một cách đáng ngạc nhiên đối với các trường hợp đơn giản khi vùng chứa được đặt trong cùng một phạm vi.

Tuy nhiên, hành vi của mypy thay đổi đáng kể tùy thuộc vào cài đặt ngữ cảnh và mức độ nghiêm ngặt. Ở phạm vi mô-đun (mã cấp cao nhất) hoặc khi vùng chứa được chuyển sang hàm khác trước khi được điền, mypy thường quay lại danh sách [Bất kỳ]. Dưới cờ --strict, điều này gây ra lỗi, nhưng ở chế độ mặc định, nó sẽ âm thầm vượt qua. Điều này có nghĩa là các nhóm chạy mypy không có chế độ nghiêm ngặt có thể tích lũy hàng tá vùng chứa được gõ ngầm hoạt động như các lối thoát khỏi hệ thống loại, làm hỏng mục đích của nó.

Một hành vi đặc biệt tinh tế: các phiên bản mypy trước 0,990 đôi khi sẽ suy ra danh sách [Không xác định] trong nội bộ và sau đó mở rộng thành danh sách [Bất kỳ] khi được chỉ định. Sau 0,990, suy luận đã được thắt chặt, nhưng sự thay đổi này đã phá vỡ một số lượng đáng ngạc nhiên các cơ sở mã trong thế giới thực vốn dựa vào hành vi cho phép mà không nhận ra. Đây là một chủ đề lặp lại — những thay đổi đối với suy luận vùng chứa trống là một trong những cập nhật mang tính đột phá nhất của trình kiểm tra loại vì các mẫu này rất phổ biến.

Pyright: Suy luận nghiêm ngặt và loại "Không xác định"

Pyright, được phát triển bởi Microsoft và hỗ trợ Pylance trong VS Code, có quan điểm triết học khác về cơ bản. Thay vì âm thầm

Build Your Business OS Today

From freelancers to agencies, Mewayz powers 138,000+ businesses with 207 integrated modules. Start free, upgrade when you grow.

Create Free Account →
...content...

Frequently Asked Questions

Các trình kiểm tra loại Python có thể đoán kiểu của thùng rỗng như thế nào?

Các trình kiểm tra loại Python sử dụng logic suy luận để đoán kiểu của thùng rỗng. Thông thường, trình kiểm tra sẽ suy luận kiểu của thùng rỗng dựa trên ngữ cảnh và cách sử dụng thùng đó trong mã nguồn. Ví dụ, nếu thùng rỗng được gán cho một biến có kiểu dữ liệu cụ thể, trình kiểm tra sẽ sử dụng kiểu đó làm gợi ý. Trong một số trường hợp, trình kiểm tra có thể sử dụng các quy tắc suy luận phức tạp hơn để đoán kiểu chính xác hơn.

Điều gì khiến việc suy luận kiểu cho thùng rỗng trở nên khó khăn?

Suy luận kiểu cho thùng rỗng trở nên khó khăn vì thùng rỗng không cung cấp bất kỳ thông tin kiểu nào. Điều này khiến trình kiểm tra loại phải dựa vào ngữ cảnh và cách sử dụng thùng đó để suy luận. Ngoài ra, các trình kiểm tra loại khác nhau có thể áp dụng các quy tắc suy luận khác nhau, dẫn đến sự khác biệt trong kết quả kiểm tra. Sự không chắc chắn này có thể gây khó khăn cho các kỹ sư khi cố gắng hiểu và sửa lỗi liên quan đến thùng rỗng.

Làm thế nào để cải thiện độ chính xác của suy luận kiểu cho thùng rỗng?

Để cải thiện độ chính xác của suy luận kiểu cho thùng rỗng, bạn có thể thực hiện một số biện pháp. Đầu tiên, cố gắng cung cấp chú thích kiểu rõ ràng cho các biến và tham số. Điều này giúp trình kiểm tra loại có thông tin kiểu chính xác hơn. Ngoài ra, sử dụng các công cụ hỗ trợ như Mewayz (208 modules, $49/mo) có thể giúp cải thiện độ chính xác của suy luận kiểu bằng cách cung cấp các quy tắc suy luận nâng cao và tích hợp với các trình kiểm tra loại phổ biến.

Dùng Thử Mewayz Miễn Phí

Nền tảng tất cả trong một cho CRM, hóa đơn, dự án, Nhân sự & hơn thế nữa. Không cần thẻ tín dụng.

Bắt đầu quản lý doanh nghiệp của bạn thông minh hơn ngay hôm nay.

Tham gia 30,000+ doanh nghiệp. Gói miễn phí vĩnh viễn · Không cần thẻ tín dụng.

Tìm thấy điều này hữu ích? Chia sẻ nó.

Sẵn sàng áp dụng vào thực tế?

Tham gia cùng 30,000+ doanh nghiệp đang sử dụng Mewayz. Gói miễn phí vĩnh viễn — không cần thẻ tín dụng.

Bắt đầu Dùng thử Miễn phí →

Sẵn sàng hành động?

Bắt đầu dùng thử Mewayz miễn phí của bạn ngay hôm nay

All-in-one business platform. No credit card required.

Bắt đầu miễn phí →

Dùng thử 14 ngày miễn phí · Không cần thẻ tín dụng · Hủy bất kỳ lúc nào