30

Có tồn tại static analysis tools for Python, nhưng việc kiểm tra thời gian biên dịch có xu hướng trái ngược hoàn toàn với số run-time binding philosophy mà Python nắm lấy. Đó là có thể để gói trình thông dịch Python chuẩn với một công cụ phân tích tĩnh để thực thi một số hạn chế "use strict", nhưng chúng tôi không thấy bất kỳ sự chấp nhận rộng rãi nào của một thứ như vậy.Có cần một trình biên dịch Python "sử dụng nghiêm ngặt" không?

Có điều gì đó về Python khiến hành vi "sử dụng nghiêm ngặt" không cần thiết hoặc đặc biệt không mong muốn?

Ngoài ra, hành vi "sử dụng nghiêm ngặt" không cần thiết trong Perl, bất chấp việc áp dụng rộng rãi của nó?

Lưu ý: Bằng "cần thiết", tôi có nghĩa là "thiết thực cần thiết", không hoàn toàn cần thiết. Rõ ràng bạn có thể viết Perl mà không "sử dụng nghiêm ngặt", nhưng (từ những gì tôi đã nhìn thấy) hầu hết các lập trình viên Perl làm sử dụng nó.

Lưu ý: Trình bao bọc thông dịch Python không cần yêu cầu "sử dụng các ràng buộc" nghiêm ngặt "- bạn có thể sử dụng pseudo-pragma tương tự như" sử dụng nghiêm ngặt ". Tôi không nói về việc thêm một tính năng cấp ngôn ngữ.


Cập nhật: Giải thích những gì "sử dụng nghiêm ngặt" trong Perl cho mỗi nhận xét. (Liên kết đến tài liệu chính thức là trong đoạn đầu tiên.)

Các "sử dụng nghiêm ngặt" chỉ có ba thành phần riêng biệt, chỉ có hai trong số đó là thực sự thú vị:

  • sử dụng vars nghiêm ngặt: Tĩnh kiểm tra lexically scoped sử dụng biến trong chương trình của bạn. (Hãy nhớ rằng, trong Python, về cơ bản chỉ có phạm vi global và phạm vi local). Nhiều người lùn Python kiểm tra loại điều này. Vì đó là phân tích tĩnh duy nhất mà chúng có thể làm, các linters cho rằng bạn sử dụng phạm vi từ vựng đơn giản và cảnh báo bạn về những thứ có vẻ sai trong ý nghĩa đó cho đến khi bạn yêu cầu chúng đóng; tức là

    FOO = 12 
    foo += 3 
    

    Nếu bạn không làm bất kỳ điều gì lạ mắt với không gian tên, điều này có thể hữu ích để kiểm tra lỗi chính tả.

  • sử dụng refs nghiêm ngặt: Ngăn chặn không gian tên biểu tượng dereferencing. Tương tự gần nhất của Python đang sử dụng locals()globals() để thực hiện tra cứu ràng buộc và nhận dạng ký hiệu.

  • sử dụng các đăng ký nghiêm ngặt: Không có tương tự thực trong Python.

+0

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

+0

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

+0

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

Trả lời

12

"thời gian chạy binding triết lý rằng Python bao trùm ... làm cho 'sử dụng' hành vi không cần thiết [và] đặc biệt không mong muốn" nghiêm ngặt

tóm tắt Khá tốt. Cảm ơn.

Đó thực chất là nó. Các công cụ phân tích tĩnh không giúp Python đủ để đáng giá.


Sửa

"Tôi đang yêu cầu cho chúng tôi để nội quan trên tại sao chúng ta không cần nó và, relatedly, tại sao lập trình Perl nghĩ rằng họ không cần nó."

Lý do chính xác là lý do bạn đã đưa ra. Chúng tôi không cần nó vì nó không giúp được gì. Rõ ràng, bạn không thích câu trả lời đó, nhưng không có nhiều điều để nói. Biên dịch thời gian biên dịch hoặc biên dịch thời gian đơn giản không giúp ích gì.

Tuy nhiên, vì bạn đã dành thời gian hỏi lại câu hỏi, tôi sẽ cung cấp thêm bằng chứng cho câu trả lời bạn đã đưa ra.

Tôi viết Java gần như nhiều như tôi viết Python. Kiểm tra kiểu tĩnh của Java không ngăn cản bất kỳ vấn đề logic nào; nó không tạo điều kiện cho các yêu cầu về hiệu suất cuộc họp; nó không giúp đáp ứng các trường hợp sử dụng. Nó thậm chí không làm giảm khối lượng kiểm tra đơn vị.

Trong khi kiểm tra loại tĩnh không phát hiện việc sử dụng sai mục đích thường xuyên của một phương pháp, bạn sẽ thấy điều này nhanh chóng bằng Python. Trong Python bạn tìm thấy nó tại thời gian thử nghiệm đơn vị vì nó sẽ không chạy. Lưu ý: Tôi không nói loại sai được tìm thấy với rất nhiều bài kiểm tra đơn vị thông minh, tôi nói rằng hầu hết các vấn đề loại sai được tìm thấy thông qua các ngoại lệ chưa được giải quyết, nơi điều đơn giản sẽ không chạy đủ xa để kiểm tra xác nhận.

Lý do tại sao Pythonistas không lãng phí thời gian vào việc kiểm tra tĩnh là đơn giản. Chúng ta không cần nó. Nó không cung cấp bất kỳ giá trị nào. Đó là một mức phân tích không có lợi ích kinh tế. Nó không làm cho tôi có thể giải quyết được những vấn đề thực sự mà những người thực sự đang có với dữ liệu thực của họ.

Nhìn vào các câu hỏi phổ biến nhất của SO Python là ngôn ngữ (không phải tên miền hoặc thư viện vấn đề) có liên quan.

Is there any difference between "foo is None" and "foo == None"? - == so với is. Không có kiểm tra tĩnh có thể giúp với điều này. Ngoài ra, hãy xem Is there a difference between `==` and `is` in Python?

What does ** (double star) and * (star) do for parameters? - *x cung cấp danh sách, **x cho từ điển. Nếu bạn không biết điều này, chương trình của bạn sẽ chết ngay lập tức khi bạn cố gắng làm điều gì đó không phù hợp với những loại đó. "Nếu chương trình của bạn không bao giờ làm bất cứ điều gì" không phù hợp ". Sau đó, chương trình của bạn hoạt động. 'nuff nói.

How can I represent an 'Enum' in Python? - đây là lời bào chữa đối với một số loại miền hạn chế. Một lớp học có giá trị cấp lớp khá nhiều so với công việc đó. "Nếu ai đó thay đổi nhiệm vụ". Dễ xây dựng. Ghi đè __set__ để tăng ngoại lệ. Có kiểm tra tĩnh có thể phát hiện điều này. Không, nó không xảy ra trong thực tế rằng ai đó bị lẫn lộn về một hằng số enum và một biến; và khi họ làm, thật dễ dàng để phát hiện tại thời gian chạy. "Nếu logic không bao giờ bị xử tử". Vâng, đó là thiết kế kém và thử nghiệm đơn vị kém. Ném một lỗi trình biên dịch và đưa vào logic sai đó là không bao giờ được thử nghiệm là không tốt hơn so với những gì xảy ra trong một ngôn ngữ năng động khi nó không bao giờ được thử nghiệm.

Generator Expressions vs. List Comprehension - kiểm tra tĩnh không giúp giải quyết câu hỏi này.

Why does 1+++2 = 3? - kiểm tra tĩnh sẽ không phát hiện ra điều này. 1 +++ 2 trong C là hoàn toàn hợp pháp mặc dù tất cả các kiểm tra trình biên dịch. Nó không phải là điều tương tự trong Python như nó là trong C, nhưng chỉ là hợp pháp. Và chỉ là khó hiểu.

List of lists changes reflected across sublists unexpectedly - Đây là khái niệm hoàn toàn. Kiểm tra tĩnh cũng không thể giúp giải quyết vấn đề này. Tương đương Java cũng sẽ biên dịch và hoạt động kém.

+8

Câu trả lời của bạn khá nhiều, "Nó không cần thiết." Tôi hiểu rằng rất nhiều mã Python đã được viết thành công mà không có nó - Tôi yêu cầu chúng tôi nhìn vào * tại sao * chúng tôi không cần nó và, liên quan, tại sao các lập trình viên Perl nghĩ họ cần nó. – cdleary

+0

câu cuối cùng có một lời giải thích ngắn hơn từ Zen của Python một lần nữa (về lý do tại sao kiểm tra biên dịch tĩnh như 'sử dụng nghiêm ngặt' sẽ không bao giờ làm việc với python): Không gian tên là một ý tưởng tuyệt vời - hãy làm nhiều hơn! – popcnt

+1

Một lần nữa, "sử dụng nghiêm ngặt" không phải là một kiểm tra biên dịch thời gian tĩnh. – mpeters

-2

Dường như lý tưởng của mã "Pythonic" phục vụ nhiều mục đích giống như use strict.

+0

Bạn có thể giải thích chính xác điều đó có nghĩa là gì không? "sử dụng nghiêm ngặt" được xác định rõ, nhưng "Pythonic" có một số ý nghĩa không được tài liệu hóa và có phần chủ quan. "nhập khẩu" này không phải là giải thích đầy đủ. ;-) – cdleary

+0

Khi bobince giải thích sâu, Python cố gắng chỉ có một cách làm rõ ràng, vì vậy Python không bao giờ cho phép nhiều cấu trúc mà Perl cho phép nhưng 'sử dụng strict' thì không. –

11

Python không có cái gì đó có thể thay đổi cú pháp kịch bản:

from __future__ import print_function 

và khác nhau trong tương lai tính năng khác mà có ý nghĩa cú pháp. Nó chỉ là cú pháp của Python đã được chặt chẽ hơn, stabler và nhiều hơn nữa được xác định rõ ràng hơn Perl lịch sử; những thứ mà ‘nghiêm ngặt refs’ và ‘nghiêm ngặt người đăng ký’ cấm chưa bao giờ tồn tại trong Python.

‘nghiêm ngặt vars’ chủ yếu nhằm ngăn chặn các tham chiếu bị lỗi và bỏ lỡ ‘tôi tạo hình cầu ngẫu nhiên (tốt, biến gói trong thuật ngữ Perl). Điều này không thể xảy ra trong Python như là gán gán mặc định cho khai báo cục bộ, và các ký hiệu chưa được gán sẽ dẫn đến một ngoại lệ.

(Vẫn còn trường hợp người dùng vô tình cố gắng ghi vào toàn cục mà không khai báo nó bằng câu lệnh 'toàn cục', gây ra sự cố cục bộ hoặc thường xuyên hơn là UnboundLocalError. Điều này có xu hướng học được khá nhanh chóng, nhưng nó là một trường hợp đáng tranh cãi khi phải khai báo người dân địa phương của bạn có thể giúp đỡ. Mặc dù một vài lập trình viên Python có kinh nghiệm sẽ chấp nhận gánh nặng dễ đọc.)

Các thay đổi ngôn ngữ và thư viện khác không liên quan đến cú pháp được xử lý qua hệ thống warnings.

+0

Tôi thích câu trả lời này sẽ diễn ra ở đâu. Tôi figured rằng bằng cách sử dụng globals() [] hoặc người dân địa phương() [] sẽ được tương tự như refs nghiêm ngặt, mặc dù tôi đồng ý về subs nghiêm ngặt. Nó có vẻ như có một nhu cầu để kiểm tra trong các bộ phận typo, mặc dù - tại sao không phải mọi người rơi trên tất cả các công cụ phân tích tĩnh để kiểm tra lỗi chính tả của họ? – cdleary

3

Tôi xem xét 'use strict' trong Perl giống như một pragma như bạn đã gợi ý: nó thay đổi hành vi của trình biên dịch.

Triết lý ngôn ngữ Perl khác với triết lý python. Như trong, bạn được đưa ra quá đủ dây để treo mình nhiều lần, trong Perl.

Larry Wall là lớn vào ngôn ngữ học, vì vậy chúng tôi có từ Perl gì được gọi là nguyên tắc vs Zen của python các TIMTOWTDI (nói tim-toe-dee):

There should be one-- and preferably only one --obvious way to do it.

bạn có thể rất dễ dàng sử dụng pylint và pychecker để đến với hương vị của riêng bạn là use strict cho python (hoặc một cái gì đó tương tự như perl -cw *scriptname*) nhưng vì những triết lý khác nhau trong thiết kế ngôn ngữ, bạn sẽ không gặp phải điều này trong thực tế rộng rãi.

Dựa trên nhận xét của bạn cho người đăng đầu tiên, bạn đã quen thuộc với python's import this. Có rất nhiều thứ trong đó chiếu sáng tại sao bạn không thấy tương đương với use strict bằng Python. Nếu bạn thiền định trên koan được tìm thấy trong Thiền của Python, bạn có thể tìm thấy sự giác ngộ cho chính mình. :)

+3

Tôi đã hy vọng tôi sẽ không thấy một câu trả lời nói với tôi để "nhập khẩu này" mà không đưa ra một lời giải thích thực sự. Làm thế nào một trình biên dịch kiểm tra phạm vi nhận dạng vi phạm các luận văn Pythonic? Tra cứu thời gian chạy làm cho phân tích từ vựng tĩnh đủ vô dụng như thế nào? Chúng tôi biết các triết lý khác nhau. – cdleary

+0

f bạn có trình soạn thảo ít được giải thích hơn, không giúp bạn phát hiện ra các biến có tên (trong cả perl hoặc python, hoặc bất kỳ thứ gì) hoặc ngăn chặn chúng ngay từ đầu, sau đó có thể có lợi ích tích cực cho phân tích từ vựng tĩnh. pylint và PyChecker dường như sẽ bao phủ đầy đủ không gian này? – popcnt

+0

Có, vì vậy câu hỏi của tôi là liệu có cần một trình biên dịch tự động gọi loại phân tích tĩnh này nếu bạn đưa ra chỉ thị và tại sao/tại sao không. Ngoài ra, bạn đang đề cập đến biên tập viên nào? Chắc chắn bạn không tự động hoàn thành * mọi tên biến * bất kể trình soạn thảo bạn đang sử dụng. – cdleary

-3

Tôi không có nền Perl, nhưng từ những gì tôi biết, không có tính năng nào trong python cần được tắt để mã của bạn "đáng tin cậy hơn", vì vậy, theo ý nghĩa đó, tôi đoán bạn có thể nói đó là không cần thiết

5

Python không có phạm vi từ vựng thực sự đúng, vì vậy các vars nghiêm ngặt sẽ không thể rất hợp lý. Nó không có tham chiếu tượng trưng AFAIK, do đó, nó không cần cho refs nghiêm ngặt. Nó không phải barewords, do đó, nó không có nhu cầu cho nghiêm ngặt vars.

Thành thật mà nói, nó chỉ là phạm vi từ vựng tôi nhớ. Hai người kia tôi sẽ xem xét mụn cóc ở Perl.

+0

thuộc tính với double underbar (obj .__ attr) không được tính là phạm vi từ vựng cho bạn? – popcnt

+2

Các thuộc tính ít có liên quan đến phạm vi từ vựng. –

+0

Ý của bạn là gì? Python rõ ràng có phạm vi từ vựng (ít nhất là từ 2.1), nhưng tôi không thấy rằng nó có nhiều việc phải làm với yêu cầu khai báo nghiêm ngặt. Bạn đang đề cập đến cái gì khác bằng cách này? – Brian

7

Tôi nghĩ có một số nhầm lẫn là những gì "sử dụng nghiêm ngặt", từ những nhận xét tôi thấy. Nó không bật kiểm tra kiểu thời gian biên dịch (giống như Java).Theo nghĩa đó, những người ủng hộ Perl đồng ý với các lập trình viên python. Như S.Lott nói trên các loại kiểm tra không bảo vệ chống lại lỗi logic, không làm giảm số lượng các bài kiểm tra đơn vị bạn cần phải viết và chúng tôi cũng không phải người hâm mộ lớn của lập trình bondage.

Dưới đây là một danh sách những gì "sử dụng nghiêm ngặt" không làm:

  1. Sử dụng tài liệu tham khảo biểu tượng là một lỗi thời gian chạy. Điều này ngăn cản bạn làm (những thứ mà đôi khi hữu ích tương tự) điên

    $var = 'foo';

    $foo = 'bar';

    print $$var; # this would contain the contents of $foo unless run under strict

  2. Sử dụng các biến chưa được khai báo là một lỗi thời gian chạy (điều này có nghĩa là bạn cần phải sử dụng " "," của chúng tôi "hoặc" địa phương "để khai báo phạm vi của biến số của bạn trước khi sử dụng.

  3. Tất cả các thanh được coi là biên dịch thời gian lỗi ntax. Barewords là những từ chưa được khai báo là biểu tượng hoặc chương trình con. Điều này chủ yếu là để loại bỏ một cái gì đó đã được thực hiện trong lịch sử nhưng được coi là một sai lầm.

+0

"không giảm số lượng bài kiểm tra đơn vị bạn cần phải viết": Trừ khi bạn tin rằng bài kiểm tra đơn vị từng khối thu âm duy nhất-và-tốt hơn chỉ để kiểm tra lỗi chính tả là một sự lãng phí lớn thời gian của một lập trình viên. Trong đó, đánh giá bởi các đơn vị kiểm tra hầu hết pythonistas tôi đã nhìn thấy viết, không phải là một ý kiến ​​không phổ biến. –

34

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, 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.)

+0

Có các bộ kiểm tra tĩnh như pylint và pychecker có thể làm điều này cho bạn. –

+2

python KHÔNG "từ chối" mã để sử dụng thuật ngữ của bạn, nhưng vào thời gian chạy. một trình soạn thảo phong nha sẽ giúp tránh những sai lầm như vậy, trong cả hai perl và python - đó là điểm -> tránh bao gồm các lỗi không mong muốn trong mã nguồn của bạn. – popcnt

+0

xem ví dụ này từ python: >>> strict_is_for_those_with_worthless_code_editors = 'yes' >>> strict_Is_god + = 'RUN THỜI GIAN Fatal error' Traceback (cuộc gọi gần đây nhất cuối cùng): File "", dòng 1, trong? TênError: tên 'strict_Is_god' không được xác định >>> – popcnt

1

Tôi thấy rằng tôi chỉ thực sự quan tâm đến việc phát hiện các tham chiếu đến các vars không khai báo. Eclipse có khả năng tích hợp thông qua PyDev và, mặc dù pylint là hoàn hảo, nhưng nó có một công việc hợp lý ở đó.

Tính năng này có tác dụng chống lại bản chất động của Python và tôi thỉnh thoảng phải thêm #IGNOREs khi mã của tôi thông minh về điều gì đó. Nhưng tôi thấy điều đó xảy ra không thường xuyên mà tôi hài lòng với nó.

Nhưng tôi có thể thấy tiện ích của một số chức năng giống như pylint có sẵn dưới dạng cờ dòng lệnh. Loại giống như chuyển đổi -3 của Python 2.6, xác định các điểm không tương thích giữa mã Python 2.x và 3.x.

+1

Vâng, đây là dọc theo dòng tôi đã suy nghĩ là tốt - quấn các thông dịch viên thường xuyên với một lá cờ bổ sung để bật "sử dụng nghiêm ngặt" biên dịch. Tôi chưa bao giờ thấy bất cứ điều gì như thế này, nhưng các nhà tư tưởng Perl có xu hướng xem xét nó cần thiết/mong muốn. Các nhà tư tưởng Python có xu hướng không quan tâm. Tại sao chúng ta không quan tâm? – cdleary

4

Câu trả lời gốc này là chính xác, nhưng có lẽ không giải thích được tình huống theo nghĩa thực tế.

There exist static analysis tools for Python, but compile time checks tend to be >diametrically opposed to the run-time binding philosophy that Python embraces.

gì 'sử dụng nghiêm ngặt' cung cấp trong Perl là khả năng để đảm bảo rằng một tên sai chính tả hoặc biến là (thường) bị bắt tại thời gian biên dịch. Điều này cải thiện mã số độ tin cậy và tăng tốc độ phát triển. Nhưng để làm một điều như vậy đáng giá, bạn cần khai báo biến. Và phong cách Python dường như không khuyến khích điều đó. Vì vậy, trong Python, bạn không bao giờ tìm hiểu về biến sai chính tả cho đến khi bạn nhận thấy tại thời gian chạy mà nhiệm vụ bạn cho là không được thực hiện hoặc biểu hiện dường như giải quyết đến một giá trị không mong muốn . Việc bắt các lỗi như vậy có thể là tốn thời gian, đặc biệt khi các chương trình trở nên lớn và khi mọi người buộc phải duy trì mã số do người khác phát triển.

Java và C/C++ tiến thêm một bước nữa, với kiểm tra loại. Động lực là thực tế, hơn là triết học. Làm thế nào bạn có thể bắt được càng nhiều lỗi càng tốt càng sớm càng tốt, và chắc chắn rằng bạn loại bỏ tất cả chúng trước khi phát hành mã để sản xuất? Mỗi ngôn ngữ dường như có một chiến lược cụ thể và chạy theo chiến lược đó, dựa trên những gì mà họ xem là quan trọng. Trong một ngôn ngữ như Perl, nơi liên kết thời gian chạy không được hỗ trợ, nên tận dụng lợi thế của việc 'sử dụng nghiêm ngặt' để giúp phát triển dễ dàng hơn.

+0

Điều này đau ít hơn nhiều trong python, mặc dù, hơn ví dụ trong Java. Khi thực hiện lỗi đánh máy trong LongNamedFunctionNeededInJava, bạn sẽ không thấy dễ dàng. Nếu bạn tạo lỗi đánh máy trong user_name, được nhập từ mô-đun mùa đông giả định (từ user_name nhập mùa đông), bạn sẽ phát hiện ra rằng gần như cùng một lúc. Và nó sẽ được hiển thị tại thời điểm tải, vì đó là nơi bạn thường nhập nội dung. Đi xuống để sử dụng không gian tên: Chúng cho phép giữ mã có thể đọc được. –

1

Rất khó để viết các chương trình lớn mà không 'sử dụng nghiêm ngặt' trong Perl. Nếu không sử dụng nghiêm ngặt, nếu bạn sử dụng lại biến và viết sai chính tả bằng cách để lại một chữ cái, chương trình vẫn chạy. Và không có trường hợp kiểm tra để kiểm tra kết quả của bạn, bạn không bao giờ có thể tìm thấy lỗi như vậy. Nó có thể rất tốn thời gian để tìm lý do tại sao bạn nhận được kết quả sai do lý do này.

Một số chương trình Perl của tôi bao gồm 5.000 dòng đến 10.000 dòng mã được chia thành hàng tá mô-đun. Người ta không thể thực sự lập trình sản xuất mà không 'sử dụng nghiêm ngặt'. Tôi sẽ không bao giờ cho phép mã sản xuất được cài đặt trong nhà máy với các ngôn ngữ không thực thi "các khai báo biến".

Đây là lý do tại sao Perl 5.12.x hiện có 'sử dụng nghiêm ngặt' làm hành vi mặc định. Bạn có thể tắt chúng đi.

PHP đã cho tôi một số vấn đề do không có sự thực thi khai báo biến. Vì vậy, bạn cần giới hạn bản thân với các chương trình nhỏ bằng ngôn ngữ này.

Chỉ cần một ý kiến ​​...

abcParsing

0

Perl là một ngôn ngữ tự do như họ nói :). Vì vậy, bạn có thể sử dụng biến trước khi được công bố; Ví dụ: Nếu bạn sử dụng tên var "is_array" nhưng nhập "is_arrby", trình biên dịch sẽ không báo cáo lỗi mà không "sử dụng nghiêm ngặt". Vì vậy, khi mã hóa chương trình dài trong perl, sử dụng tốt hơn "sử dụng nghiêm ngặt" tuyên bố. Tất nhiên, ít hơn 50 dòng cho chạy một tập lệnh thời gian, không cần :)

+1

Tôi đang bối rối. Chúng ta đang nói về Python hay Perl ở đây? – ccjmne

+0

@ ccjmne, Hah, vâng. Tôi nghĩ perl mang đến cho bạn rất nhiều tự do để làm bất cứ điều gì để xây dựng chương trình nếu không có lỗi cú pháp; Trong python, một chút hạn chế, nhưng là đủ ... :) – BinDu

Các vấn đề liên quan