Các thử nghiệm cho điều này là khá đơn giản (Lib/tests/test_exceptions.py
):
self.raise_catch(TabError, "TabError")
try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n",
'<string>', 'exec')
except TabError: pass
else: self.fail("TabError not raised")
Nhìn vào mã nơi lỗi này là thực sự ném (Parser/tokenizer.c
, tok_get()
) nó trông như thế này chỉ đơn thuần so sánh các loại thụt đầu dòng cho những gì trước đó sử dụng dòng và không sử dụng những gì được sử dụng trong suốt tệp.
Các tài liệu nói (Doc/reference/lexical_analysis.rst
, tôi nhấn mạnh)
Indentation bị từ chối như không phù hợp nếu một tập tin nguồn pha trộn các tab và không gian theo một cách mà làm cho ý nghĩa phụ thuộc vào giá trị của một tab trong không gian ; một số TabError
được nêu trong trường hợp đó.
Không sao trộn các tab và dấu cách nếu "khối" hoàn toàn "tách biệt" bằng cách quay lại mức thụt đầu dòng 0; vì không thể nhầm lẫn về logic của chương trình do cài đặt độ rộng tab. Vấn đề với các tab trộn và không gian trong Python là Python giả định rằng một tab là tám không gian rộng, nhưng trình soạn thảo của người lập trình có thể sử dụng cái gì đó khác.Ví dụ, mã như thế này:
def my_fun(i):
if i == 6:
foo()
------->bar() # Tab
sẽ được nhìn thấy như thế này với một tabstop 4:
def my_fun(i):
if i == 6:
foo()
bar()
Đó là rõ ràng không phải những chương trình nào!
Nhưng trong những trường hợp như:
def my_fun(i):
if i == 6:
foo()
bar()
def my_fun2(i):
--->if i == 7:
--->--->foo()
--->--->bar()
Không sao đâu từ một "logic" quan điểm như không có vấn đề làm thế nào tôi xem tab, nó luôn luôn rõ ràng những gì logic là. Đó là tất nhiên vẫn còn một ý tưởng tồi để trộn các tab và dấu cách trong một tệp, nhưng đó chỉ là lỗi kiểu cách, và không phải lỗi logic ;-)
Vì vậy, để trả lời câu hỏi: đánh giá từ một dòng đó tài liệu, tôi sẽ nói rằng điều này là do thiết kế. Tuy nhiên, tôi không thể tìm thấy PEP cho trường hợp này và trường hợp này không được kiểm tra. Tôi sẽ không dựa vào nó tất cả Phiên bản Python trong tương lai hoạt động tương tự!
Tôi không chắc liệu tôi có hiểu ý của bạn với "cố gắng phân đoạn từng khối mã nhỏ" không? – Carpetsmoker