2011-11-11 31 views
10

PEP 8 không đề cập đến toán tử slice. Từ hiểu biết của tôi, không giống như các nhà khai thác khác, nó không nên được bao quanh với khoảng trắngkiểu, định dạng toán tử slice

spam[3:5] # OK 
spam[3 : 5] # NOT OK 

Liệu giữ này khi sử dụng biểu thức phức tạp, đó là, cái nào được coi là phong cách tốt hơn

 
    1. spam[ham(66)//3:44+eggs()] 
    2. spam[ham(66) // 3: 44 + eggs()] 
    3. spam[ham(66) // 3 : 44 + eggs()] 
    4. something else? 

Trả lời

8

Như bạn đã đề cập, PEP8 không đề cập đến một cách rõ ràng các nhà điều hành lát ở định dạng đó, nhưng spam[3:5] chắc chắn là phổ biến hơn và IMHO dễ đọc hơn.

Nếu pep8 checker là bất cứ điều gì để đi theo, không gian trước khi : sẽ được gắn cờ lên

[[email protected]]$ pep8 <(echo "spam[3:44]") # no warnings 
[[email protected]]$ pep8 <(echo "spam[3 : 44]") 
/dev/fd/63:1:7: E203 whitespace before ':' 

... nhưng đó là chỉ vì nó giả định : là các nhà điều hành để xác định một dict đen và không có không gian được mong đợi trước toán tử. spam[3: 44] vượt qua vì lý do đó, nhưng điều đó dường như không đúng.

Trên số đó, tôi muốn gắn vào spam[3:44].


Hoạt động số học lồng nhau phức tạp hơn một chút. Trong số 3 ví dụ của bạn, chỉ có 2 ví dụ mới vượt qua được xác thực PEP8:

[[email protected]]$ pep8 <(echo "spam[ham(66)//3:44+eggs()]") 
/dev/fd/63:1:13: E225 missing whitespace around operator 

[[email protected]]$ pep8 <(echo "spam[ham(66) // 3:44 + eggs()]") # OK 

[[email protected]]$ pep8 <(echo "spam[ham(66) // 3 : 44 + eggs()]") 
/dev/fd/63:1:18: E203 whitespace before ':' 

Tuy nhiên, tôi thấy tất cả những điều khó phân tích ở trên bằng mắt ngay từ cái nhìn đầu tiên.

Đối với khả năng đọc và tuân thủ PEP8, tôi muốn đích thân đi cho:

spam[(ham(66) // 3):(44 + eggs())] 

Hoặc cho các hoạt động phức tạp hơn:

s_from = ham(66) // 3 
s_to = 44 + eggs() 
spam[s_from:s_to] 
2

Tôi đồng ý với bạn ví dụ đầu tiên. Đối với cái sau: PEP 20. Số lượng khả năng đọc. Phần ngữ nghĩa quan trọng nhất của biểu thức slice phức tạp của bạn là chính toán tử slice, nó chia biểu thức thành hai phần cần được phân tích cú pháp (cả bởi người đọc và trình thông dịch) một cách riêng biệt. Do đó trực giác của tôi là sự nhất quán với PEP 8 nên được hy sinh để làm nổi bật nhà điều hành :, tức là. bởi xung quanh nó bằng khoảng trắng như trong ví dụ 3. Câu hỏi là nếu bỏ qua khoảng trắng trong hai bên của biểu thức để tăng khả năng đọc hay không:

1. spam[ham(66)/3 : 44+eggs()] 

vs

2. spam[ham(66)/3 : 44 + eggs()] 

tôi thấy 1. nhanh hơn để phân tích cú pháp.

3

tôi thấy cắt sử dụng trong PEP8:

 
    - Use ''.startswith() and ''.endswith() instead of string slicing to check 
     for prefixes or suffixes. 

     startswith() and endswith() are cleaner and less error prone. For 
     example: 

     Yes: if foo.startswith('bar'): 

     No: if foo[:3] == 'bar': 

tôi sẽ không gọi đó là dứt khoát nhưng nó sao lưu của bạn (và tôi) hiểu biết:

spam[3:5] # OK 

As far as để sử dụng trong tình huống phức tạp hơn, tôi sẽ sử dụng # 3. Tôi không nghĩ rằng không gian xung quanh-the : phương pháp có vẻ tốt trong trường hợp đó:

spam[ham(66)/3:44 + eggs()] # looks like it has a time in the middle. Bad. 

Nếu bạn muốn : để nổi bật hơn, không hy sinh khoảng cách điều hành, thêm không gian thêm để các ::

spam[ham(66)/3 : 44 + eggs()] # Wow, it's easy to read! 

tôi sẽ không sử dụng # 1 vì tôi thích khoảng cách điều hành và # 2 có vẻ quá nhiều như từ điển key: value cú pháp.

Tôi cũng sẽ không gọi nó là toán tử. Đó là cú pháp đặc biệt để xây dựng một đối tượng slice - bạn cũng có thể làm

spam[slice(3, 5)] 
Các vấn đề liên quan