2016-03-17 16 views
5

Tôi biết có nhiều câu hỏi trên các tab so với dấu cách, nhưng có vẻ như trái ngược với những gì PEP 0008 nói về Python 3, các tab và không gian trộn không phải lúc nào cũng bất hợp pháp. Cụ thể, các tab trộn và dấu cách trong cùng một khối là bất hợp pháp, nhưng các khối có dấu cách và các khối có các tab được cho phép trong cùng một tệp.Python 3 cho phép trộn không gian và các tab?

Ví dụ, điều này ném một TabError trên Python 3.4:

for x in range(10): 
    print(x) # Spaces 
    print(x) # Tab 

Nhưng điều này chạy tốt:

for x in range(10): 
    print(x) # Spaces 

for y in range(5): 
    print(y) # Tab 

Đây có phải là do thiết kế?

Chỉnh sửa: Câu hỏi là không phải liệu các tab có tốt hơn không gian hay không. Câu hỏi đặt ra là liệu Python cho phép các tab và không gian trong cùng một tệp là do thiết kế.

Trả lời

4

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ự!

1

Python cố phân đoạn từng khối mã nhỏ để khi bạn sao chép và dán, nó vẫn hoạt động và bạn không bị buộc phải làm mọi thứ hoàn hảo. Một trong nhiều người đẹp của python.

PEP 8 chỉ là một quy ước cho mã dễ đọc nhất, và tôi khuyên bạn nên làm theo nó, nhưng bạn không phải

Nếu bạn muốn tìm những gì PEP 8 bao hàm có một số trình chỉnh sửa sẽ kiểm tra mã của bạn đối với các vi phạm hợp pháp trong python, nhưng không tốt. Tôi sử dụng PyCharm. PyCharm không thích khi bạn sử dụng các dấu cách và các tab trong cùng một tệp và nó sẽ trở nên khó hiểu với các lớp lót bên dưới.

+0

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

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