Vâng, tôi không phải là người lập trình python, nhưng tôi muốn nói câu trả lời là 'CÓ'.
Bất kỳ ngôn ngữ động nào cho phép bạn tạo biến với bất kỳ tên nào vào bất kỳ lúc nào, đều có thể sử dụng 'pragma' nghiêm ngặt.
Vữa nghiêm ngặt (một trong các tùy chọn cho nghiêm ngặt trong Perl, 'sử dụng nghiêm ngặt' biến tất cả cùng một lúc) trong Perl yêu cầu tất cả các biến được khai báo trước khi chúng được sử dụng. Có nghĩa là mã này:
my $strict_is_good = 'foo';
$strict_iS_good .= 'COMPILE TIME FATAL ERROR';
Tạo ra lỗi nghiêm trọng khi biên dịch.
Tôi không biết một cách để có được Python để từ chối mã này ở thời gian biên dịch:
strict_is_good = 'foo';
strict_iS_good += 'RUN TIME FATAL ERROR';
Bạn sẽ nhận được một ngoại lệ thời gian chạy mà strict_iS_good
là undefined. Nhưng chỉ khi mã được thực hiện. Nếu bộ thử nghiệm của bạn không có phạm vi phủ sóng 100%, bạn có thể dễ dàng phát hành lỗi này.
Bất cứ lúc nào tôi làm việc bằng ngôn ngữ không có hành vi này (ví dụ PHP), tôi cảm thấy lo lắng. Tôi không phải là một người đánh máy hoàn hảo. Một lỗi đơn giản nhưng khó phát hiện, lỗi đánh máy có thể làm cho mã của bạn thất bại theo những cách có thể khó theo dõi.
Vì vậy, để nhắc lại, CÓ Python có thể sử dụng pragma 'nghiêm ngặt' để bật kiểm tra thời gian biên dịch cho những thứ có thể được kiểm tra tại thời gian biên dịch. Tôi không thể nghĩ ra bất kỳ kiểm tra nào khác để thêm, nhưng một lập trình viên Python tốt hơn có thể nghĩ về một số.
Lưu ý Tôi tập trung vào hiệu ứng thực dụng của các vệt stict trong Perl và sáng lên một số chi tiết. Nếu bạn thực sự muốn biết tất cả các chi tiết, hãy xem the perldoc for strict.
Cập nhật: Responses to một số ý kiến
Jason Baker: cờ tĩnh như pylint rất hữu ích. Nhưng chúng đại diện cho một bước phụ có thể và thường bị bỏ qua. Xây dựng một số kiểm tra cơ bản vào trình biên dịch đảm bảo rằng các kiểm tra này được thực hiện nhất quán. Nếu những kiểm tra này được kiểm soát bởi một pragma, ngay cả những phản đối liên quan đến chi phí của các kiểm tra sẽ trở thành tranh luận.
popcnt: Tôi biết rằng python sẽ tạo ra ngoại lệ thời gian chạy. Tôi nói nhiều. Tôi ủng hộ việc kiểm tra thời gian biên dịch nếu có thể. Vui lòng đọc lại bài đăng.
mpeters: Không phân tích mã máy tính nào có thể tìm thấy tất cả các lỗi - số tiền này để giải quyết sự cố tạm dừng. Tồi tệ hơn, để tìm lỗi chính tả trong bài tập, trình biên dịch của bạn sẽ cần biết ý định của bạn và tìm những địa điểm có ý định khác với mã của bạn. Điều này là khá rõ ràng là không thể.
Tuy nhiên điều này không có nghĩa là không thực hiện kiểm tra. Nếu có các lớp của các vấn đề dễ phát hiện, thì có nghĩa là bẫy chúng.
Tôi không đủ quen thuộc với pylint và pychecker để nói loại lỗi nào họ sẽ bắt được. Như tôi đã nói tôi rất thiếu kinh nghiệm với python.
Các chương trình phân tích tĩnh này hữu ích. Tuy nhiên, tôi tin rằng trừ khi họ sao chép các khả năng của trình biên dịch, trình biên dịch sẽ luôn ở vị trí để "biết" nhiều hơn về chương trình hơn bất kỳ trình kiểm tra tĩnh nào có thể. Có vẻ như lãng phí không tận dụng điều này để giảm thiểu các lỗi nếu có thể.
Cập nhật 2:
cdleary - Về lý thuyết, tôi đồng ý với bạn, một phân tích tĩnh có thể làm bất cứ xác nhận rằng trình biên dịch có thể. Và trong trường hợp của Python, nó là đủ. Tuy nhiên, nếu trình biên dịch của bạn đủ phức tạp (đặc biệt nếu bạn có nhiều pragma thay đổi cách biên dịch xảy ra, hoặc nếu như Perl, bạn có thể chạy mã tại thời gian biên dịch), thì trình phân tích tĩnh phải tiếp cận sự phức tạp của trình biên dịch/thông dịch viên để thực hiện phân tích.
Heh, tất cả điều này nói về trình biên dịch phức tạp và chạy mã tại thời gian biên dịch cho thấy nền Perl của tôi.
Sự hiểu biết của tôi là Python không có pragmas và không thể chạy mã tùy ý lúc biên dịch. Vì vậy, trừ khi tôi sai hoặc các tính năng này được thêm vào, một trình phân tích cú pháp tương đối đơn giản trong trình phân tích tĩnh là đủ. Nó chắc chắn sẽ hữu ích để buộc các kiểm tra này ở mọi lần thực hiện. Tất nhiên, cách tôi làm điều này là với một pragma.
Khi bạn thêm pragmas vào hỗn hợp, bạn đã bắt đầu xuống dốc trơn và độ phức tạp của máy phân tích phải tăng theo tỷ lệ sức mạnh và tính linh hoạt mà bạn cung cấp trong pragmas. Nếu bạn không cẩn thận, bạn có thể gió lên như Perl, và sau đó "chỉ python có thể phân tích Python," một tương lai tôi sẽ không muốn nhìn thấy.
Có lẽ một chuyển đổi dòng lệnh sẽ là một cách tốt hơn để thêm phân tích tĩnh buộc;)
(Trong không có cách nào có ý định phản đối khả năng của Python khi tôi nói rằng nó không thể futz với hành vi thời gian biên dịch như Perl có thể.Tôi có linh cảm rằng đây là một quyết định thiết kế được xem xét cẩn thận, và tôi có thể thấy sự khôn ngoan trong đó. Tính linh hoạt cực độ của Perl trong thời gian biên dịch là, IMHO, một sức mạnh tuyệt vời và một điểm yếu khủng khiếp của ngôn ngữ; Tôi cũng thấy sự khôn ngoan trong cách tiếp cận này.)
nó sẽ giúp một chút nếu bạn giải thích những gì sử dụng nghiêm ngặt trong perl và tại sao nó là cần thiết? và tại sao nhiều người sử dụng nó mọi lúc? điều gì sẽ xảy ra mà không có nó? – hasen
Xem câu trả lời của tôi bên dưới về những gì "sử dụng nghiêm ngặt" thực sự. Dường như có một số nhầm lẫn trong bài đăng này và nhận xét về ý nghĩa của nó. Có lập trình viên Perl đang yêu "sử dụng nghiêm ngặt" nhưng nó không làm cho Perl thêm Java-y. – mpeters
Tất nhiên python 3 phức tạp (làm rõ?) Mọi thứ với khai báo 'không cục bộ' - như trong http://www.python.org/dev/peps/pep-3104/ – popcnt