2012-01-13 29 views
66

Tại sao PEP 8 recommend not having spaces around = in a keyword argument or a default parameter value?PEP 8, tại sao không có khoảng trắng xung quanh '=' trong đối số từ khóa hoặc giá trị thông số mặc định?

Điều này có phù hợp với việc giới thiệu khoảng trắng xung quanh mọi lần xuất hiện khác của = trong mã Python không?

như thế nào:

func(1, 2, very_long_variable_name=another_very_long_variable_name) 

tốt hơn:

func(1, 2, very_long_variable_name = another_very_long_variable_name) 

Bất kỳ liên kết đến các cuộc thảo luận/giải thích bằng Python của BDFL sẽ được đánh giá cao.

Mind, câu hỏi này là thêm về kwargs hơn giá trị mặc định, tôi chỉ cần sử dụng các phân nhịp từ PEP 8.

Tôi không lấy ý kiến. Tôi đang xin lý do đằng sau quyết định này. Nó giống như yêu cầu lý do tại sao tôi có thể sử dụng { trên cùng một dòng như câu hỏi if trong chương trình C chứ không phải cho dù Tôi có nên sử dụng hay không.

Trả lời

47

Tôi đoán rằng đó là do đối số từ khóa về cơ bản khác với phân bổ biến.

Ví dụ, có rất nhiều mã như thế này:

kw1 = some_value 
kw2 = some_value 
kw3 = some_value 
some_func(
    1, 
    2, 
    kw1=kw1, 
    kw2=kw2, 
    kw3=kw3) 

Như bạn thấy, nó làm cho hoàn toàn tinh thần để gán một biến để một đối số từ khóa có tên giống hệt nhau, vì thế cải thiện khả năng đọc để xem họ không có dấu cách. Nó dễ dàng hơn để nhận ra rằng chúng tôi đang sử dụng các đối số từ khóa và không chỉ định một biến cho chính nó.

Ngoài ra, các tham số có xu hướng đi theo cùng một dòng trong khi các nhiệm vụ thường là mỗi dòng trong dòng riêng của chúng, do đó, tiết kiệm không gian có thể là một vấn đề quan trọng ở đó.

+3

trường hợp này có thể xảy ra, nhưng vẫn có vẻ lạ khi giới thiệu biểu tượng IMO này trong các đề xuất kiểu mã cho một ngôn ngữ được thiết kế tốt, chỉ để lưu 2 ký tự. Nó giống như phong cách mã java nói rằng nó tốt hơn để đặt '{' trên một dòng mới sau 'if' (lưu cùng số ký tự) nhưng không phải trong định nghĩa lớp. Ngoài ra, thông số từ khóa khác với giá trị mặc định nhưng vẫn sử dụng cùng một đề xuất kiểu. – soulcheck

+2

Như tôi đã nói, chúng là những thứ khác nhau. Nó có ý nghĩa để viết chúng một cách khác nhau. – fortran

+5

Tôi muốn nói nó không thực sự dễ đọc hơn 'kw1 = kw1, kw2 = kw2';) nhưng có lẽ đó là những gì Guido và Barry nghĩ. – soulcheck

8

Tôi sẽ không sử dụng very_long_variable_name làm đối số mặc định. Vì vậy, xem xét việc này:

func(1, 2, axis='x', angle=90, size=450, name='foo bar') 

trên này:

func(1, 2, axis = 'x', angle = 90, size = 450, name = 'foo bar') 

Ngoài ra, nó không có ý nghĩa nhiều để sử dụng các biến như giá trị mặc định. Có lẽ một số biến không đổi (không thực sự là hằng số) và trong trường hợp đó, tôi sẽ sử dụng các tên là tất cả các mũ, mô tả nhưng ngắn nhất có thể. Vì vậy, không có another_very _...

+1

đó là các đối số từ khóa, ví dụ tương tự trong PEP tôi chỉ làm cho nó ít đọc được hơn – soulcheck

+2

Bạn đang nói (về cơ bản): để làm cho quy tắc không gian có thể đọc được, viết tên biến rất ngắn. Nhưng nếu một cái có tên biến dài, thì quy tắc không gian sẽ tạo ra một môi trường lộn xộn. Lập luận rằng 'nó không phải là một nhiệm vụ, vì vậy chúng là những thứ khác nhau' không cắt nó cho tôi, bởi vì tôi quan tâm nhiều hơn về tính dễ đọc hơn về ngữ nghĩa và vì nó không phải là 'giá trị mặc định cho một bài tập', nó? – PatrickT

+0

@PatrickT Đối số "nó không phải là một nhiệm vụ, do đó, họ là những thứ khác nhau" không có gì để giải thích _why it is_ (một khái niệm triết học); Nó chỉ giải thích _why nó ​​có thể be_ (một khái niệm cú pháp). –

5

IMO bỏ các khoảng trống cho arg cung cấp nhóm hình ảnh rõ ràng hơn về các cặp arg/value; nó trông ít lộn xộn hơn.

+0

Tôi thường thích không gian, rất nhiều vì vậy tôi có xu hướng đặt không gian ngay bên trong dấu ngoặc đơn cũng như vậy tất cả các tham số được bao quanh bởi không gian. Nhưng tôi nghĩ rằng 'arg1 = 40' dễ đọc hơn vì mối quan hệ rõ ràng hơn. –

3

Tôi nghĩ rằng có nhiều lý do cho điều này, mặc dù tôi chỉ có thể hợp lý hóa:

  1. Nó giúp tiết kiệm không gian, cho phép nhiều định nghĩa hàm và gọi để phù hợp trên cùng một dòng và tiết kiệm không gian hơn cho các tên tham số tự .
  2. Bằng cách tham gia mỗi từ khóa và giá trị, bạn có thể dễ dàng phân tách các đối số khác nhau theo khoảng trắng sau dấu phẩy. Điều này có nghĩa là bạn có thể nhanh chóng nhãn cầu xem bạn đã cung cấp bao nhiêu đối số.
  3. Cú pháp sau đó khác biệt với các bài tập biến, có thể có cùng tên.
  4. Ngoài ra, cú pháp (thậm chí nhiều hơn) khác với kiểm tra bình đẳng a == b cũng có thể là biểu thức hợp lệ bên trong cuộc gọi.
4

Có ưu và khuyết điểm.

Tôi rất không thích cách mã tuân thủ PEP8. Tôi không mua vào đối số rằng very_long_variable_name=another_very_long_variable_name có thể dễ đọc hơn con người very_long_variable_name = another_very_long_variable_name. Đây không phải là cách mọi người đọc. Đó là tải bổ sung nhận thức, đặc biệt là khi không có đánh dấu cú pháp.

Tuy nhiên, có một lợi ích đáng kể. Nếu các quy tắc khoảng cách được tuân thủ, nó làm cho việc tìm kiếm các thông số độc quyền sử dụng các công cụ hiệu quả hơn nhiều.

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