2011-01-22 32 views
82

Tôi có một dòng đoạn mã sau (không đổ lỗi cho quy ước đặt tên, họ không phải là mỏ):Làm thế nào để phá vỡ một dòng các phương pháp xích trong Python?

subkeyword = Session.query(
    Subkeyword.subkeyword_id, Subkeyword.subkeyword_word 
).filter_by(
    subkeyword_company_id=self.e_company_id 
).filter_by(
    subkeyword_word=subkeyword_word 
).filter_by(
    subkeyword_active=True 
).one() 

tôi không thích làm thế nào nó trông giống như (không quá có thể đọc được) nhưng tôi don' t có bất kỳ ý tưởng tốt hơn để giới hạn dòng 79 ký tự trong tình huống này. Có cách nào tốt hơn để phá vỡ nó (tốt hơn là không có dấu gạch chéo ngược)?

Trả lời

171

Bạn có thể sử dụng thêm dấu ngoặc đơn:

subkeyword = (
     Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) 
     .filter_by(subkeyword_company_id=self.e_company_id) 
     .filter_by(subkeyword_word=subkeyword_word) 
     .filter_by(subkeyword_active=True) 
     .one() 
    ) 
+0

Tôi cũng thích nó nhất. Không thêm nhiều mã hơn và không có dấu gạch chéo ngược. –

+13

Không chắc chắn điều gì biện minh cho sự thụt lề thêm ở đây; Tôi nghĩ rằng giải pháp này đọc chỉ là tốt với các dòng treo thụt vào chỉ một lần và paren dấu không phải ở tất cả. –

+0

Theo ý kiến ​​của tôi, đôi thụt đầu dòng hữu ích ở đây vì nó là khác biệt trực quan với một khối thụt vào bình thường. Khi được bao quanh bởi mã khác, điều này làm cho nó rõ ràng hơn rằng nó là một dòng đơn bọc. – sth

9

Chỉ lưu trữ kết quả/đối tượng trung gian và gọi phương thức tiếp theo trên đó, ví dụ:

q = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) 
q = q.filter_by(subkeyword_company_id=self.e_company_id) 
q = q.filter_by(subkeyword_word=subkeyword_word) 
q = q.filter_by(subkeyword_active=True) 
subkeyword = q.one() 
+4

Điều này phù hợp với một thứ như truy vấn nhưng dưới dạng chung, tôi không chắc lắm. Ví dụ, khi chuỗi trong Beautiful Soup như 'team_members = soup.find (class _ = 'section team'). Find_all ('ul'). Find_all ('li')', giá trị trả về từ mỗi '.find (.. .) 'cuộc gọi không phù hợp với ý nghĩa của' team_members'. –

4

Theo Python Language Reference
Bạn có thể sử dụng một dấu gạch chéo.
Hoặc đơn giản là phá vỡ nó. Nếu một khung không được ghép nối, python sẽ không coi đó là một dòng. Và trong hoàn cảnh như vậy, sự thụt đầu dòng sau không quan trọng.

1

Bạn dường như sử dụng SQLAlchemy, nếu nó là đúng, sqlalchemy.orm.query.Query.filter_by() phương pháp có nhiều đối số từ khóa, vì vậy bạn có thể viết như sau:

subkeyword = Session.query(Subkeyword.subkeyword_id, 
          Subkeyword.subkeyword_word) \ 
        .filter_by(subkeyword_company_id=self.e_company_id, 
           subkeyword_word=subkeyword_word, 
           subkeyword_active=True) \ 
        .one() 

Nhưng nó sẽ là tốt hơn:

subkeyword = Session.query(Subkeyword.subkeyword_id, 
          Subkeyword.subkeyword_word) 
subkeyword = subkeyword.filter_by(subkeyword_company_id=self.e_company_id, 
            subkeyword_word=subkeyword_word, 
            subkeyword_active=True) 
subkeuword = subkeyword.one() 
+0

+1 cho SQLAlchemy filter_by() gợi ý. Tốt cho ví dụ này, nhưng tôi thường sử dụng filter() thay vào đó chỉ chấp nhận 1 điều kiện. –

11

sự lựa chọn cá nhân của tôi sẽ là:

 
subkeyword = Session.query(
    Subkeyword.subkeyword_id, 
    Subkeyword.subkeyword_word, 
).filter_by(
    subkeyword_company_id=self.e_company_id, 
    subkeyword_word=subkeyword_word, 
    subkeyword_active=True, 
).one() 
+0

Tôi đồng ý nếu có nhiều thông số được chuyển vào nhưng có vẻ xấu xí khi thông số 0 hoặc 1 là phổ biến. Ví dụ: https://gist.github.com/andybak/b23b6ad9a68c7e1b794d –

+1

Vâng, kiểu đó có các trường hợp làm suy giảm (như bất kỳ kiểu nào). Tôi sẽ không phá vỡ tất cả các parens mở. Không có gì trong số này khiến tôi hài lòng, nhưng sau đây là một số trường hợp: https://gist.github.com/pkoch/8098c76614765750f769 – pkoch

38

Đây là trường hợp một dòng characation tiếp tục ter được ưu tiên để mở dấu ngoặc đơn. Sự cần thiết của phong cách này trở nên rõ ràng hơn khi tên phương pháp được lâu hơn và như các phương pháp bắt đầu dùng lý lẽ:

subkeyword = Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word) \ 
        .filter_by(subkeyword_company_id=self.e_company_id)   \ 
        .filter_by(subkeyword_word=subkeyword_word)     \ 
        .filter_by(subkeyword_active=True)       \ 
        .one()              \ 

PEP 8 được dự định sẽ được giải thích với một thước đo chung cảm giác và một mắt cho cả thực tế và đẹp. Vui lòng vi phạm bất kỳ hướng dẫn PEP 8 nào dẫn đến mã xấu hoặc khó đọc.

Điều đó đang được nói, nếu bạn thường xuyên thấy mình mâu thuẫn với PEP 8, nó có thể là một dấu hiệu cho thấy có những vấn đề dễ đọc mà vượt qua sự lựa chọn của bạn của khoảng trắng :-)

+2

+1 trên các dấu gạch chéo ngược và căn chỉnh các bộ lọc chuỗi trong trường hợp cụ thể này. Tình huống này cũng xuất hiện ở Django và dễ đọc nhất theo cách này - nhưng trong _any_ tình huống khác, tôi cảm thấy như các cụm từ được viết hoa là tốt hơn (không bị "có khoảng trắng sau dấu gạch chéo ngược của tôi?"). Điều đó nói rằng, ngoặc đơn cụm từ có thể được sử dụng để đạt được hiệu quả tương tự - nhưng nó đặt bạn trong chế độ đọc Lisp ở giữa đọc Python, mà tôi thấy khó chịu. – zxq9

+7

Tôi không thấy giải pháp này có khả năng đối phó tốt như thế nào khi các tên phương thức nhận được lâu hơn và khi các phương thức bắt đầu lấy các đối số "hơn là" bọc trong ngoặc đơn "hoặc" ngắt dòng sau mỗi dấu ngoặc mở và trước mỗi dấu ngoặc đóng " các giải pháp. Trong thực tế nó tồi tệ hơn lúc xử lý đó, vì (ít nhất là như được hiển thị ở đây) nó đòi hỏi một indent sâu sắc hơn cho mỗi dòng treo. –

+1

Quá nhiều thụt lề cho các cuộc gọi bộ lọc. Một tab hoặc 4 khoảng trống sẽ đủ ở đây. Cũng liên kết của '\' ... Bao nhiêu giây bạn đã giữ phím không gian đó? Nói chung tôi chống lại tất cả các cách, mà đòi hỏi bạn phải búa rằng phím không gian như không có ngày mai. – Zelphir

4

Đó là một chút của một giải pháp khác nhau hơn được cung cấp bởi những người khác nhưng một yêu thích của tôi vì nó dẫn đến lập trình meta tiện lợi đôi khi.

base = [Subkeyword.subkeyword_id, Subkeyword_word] 
search = { 
    'subkeyword_company_id':self.e_company_id, 
    'subkeyword_word':subkeyword_word, 
    'subkeyword_active':True, 
    } 
subkeyword = Session.query(*base).filter_by(**search).one() 

Đây là một kỹ thuật tốt để xây dựng các tìm kiếm. Đi qua một danh sách các điều kiện để khai thác từ biểu mẫu truy vấn phức tạp của bạn (hoặc các khoản khấu trừ dựa trên chuỗi về những gì người dùng đang tìm kiếm), sau đó chỉ phát nổ từ điển vào bộ lọc.

1

Tôi muốn thụt những lập luận bởi hai khối, và tuyên bố của một khối, như thế này:

for image_pathname in image_directory.iterdir(): 
    image = cv2.imread(str(image_pathname)) 
    input_image = np.resize(
      image, (height, width, 3) 
     ).transpose((2,0,1)).reshape(1, 3, height, width) 
    net.forward_all(data=input_image) 
    segmentation_index = net.blobs[ 
      'argmax' 
     ].data.squeeze().transpose(1,2,0).astype(np.uint8) 
    segmentation = np.empty(segmentation_index.shape, dtype=np.uint8) 
    cv2.LUT(segmentation_index, label_colours, segmentation) 
    prediction_pathname = prediction_directory/image_pathname.name 
    cv2.imwrite(str(prediction_pathname), segmentation) 
0

Tôi biết đây là một chủ đề cũ nhưng những gì về:

subkeyword=(Session.query(Subkeyword.subkeyword_id, 
          Subkeyword.subkeyword_word) 
        .filter_by(subkeyword_company_id=self.e_company_id) 
        .filter_by(subkeyword_word=subkeyword_word) 
        .filter_by(subkeyword_active=True) 
        .one()) 

Hoặc

subkeyword=(Session.query(Subkeyword.subkeyword_id, 
          Subkeyword.subkeyword_word) 
        .filter_by(subkeyword_company_id=self.e_company_id) 
        .filter_by(subkeyword_word=subkeyword_word) 
        .filter_by(subkeyword_active=True) 
        .one() 
      ) 
Các vấn đề liên quan