2008-12-06 28 views
7

Tôi đã bắt gặp thành ngữ này trong một số Python nguồn mở, và tôi nghẹn ngào với đồ uống của mình.Đây có phải là thành ngữ pythonic? (someBool và "True Result" hoặc "False Result")

Thay vì:

if isUp: 
    return "Up" 
else: 
    return "Down" 

hoặc thậm chí:

return "Up" if isUp else "Down" 

mã đọc:

return isUp and "Up" or "Down" 

tôi có thể thấy đây là kết quả tương tự, nhưng đây là một thành ngữ điển hình bằng Python? Nếu vậy, nó là một số hack hiệu suất chạy nhanh? Hay nó chỉ là một lần một lần cần xem xét mã?

Trả lời

17

Thành ngữ "a và b hoặc c" là cách kinh điển để biểu diễn số học bậc ba nếu bằng Python, trước khi PEP 308 được viết và triển khai. Thành ngữ này thất bại câu trả lời "b" là sai chính nó; để hỗ trợ các trường hợp chung, bạn có thể viết

return (a and [b] or [c])[0] 

Một cách khác để đánh vần nó là

return (b,c)[not a] 

đó, với sự ra đời của các loại bool, có thể được viết lại như

return (c,b)[bool(a)] 

(trong trường hợp không rõ ràng: chuyển đổi thành bool và toán tử không, là cần thiết nếu không được biết là bool)

Hôm nay, cú pháp biểu thức có điều kiện nên được sử dụng nếu điều đó phải là một biểu thức; khác tôi khuyên bạn nên sử dụng câu lệnh if.

+4

Cú pháp thay thế không có sự khác biệt đối với toán tử và/hoặc toán tử bậc ba - cả hai giá trị luôn được đánh giá. Không phải là một vấn đề lớn nếu chúng chỉ là các biến, nhưng nếu có các cuộc gọi hàm (đặc biệt là với các hiệu ứng phụ) trong đó, nó sẽ tạo ra sự khác biệt. – Brian

0

Mã đó là một cách khéo léo và thông minh cho sở thích của tôi, nhưng tôi cho rằng không có gì sai với nó. Tôi nghĩ rằng đây thực sự chỉ là một trường hợp "làm cho nó tất cả phù hợp trong một dòng" hội chứng.

Cá nhân tôi đã chọn tham gia biểu mẫu đầu tiên.

-1

Không, không phải.

Tôi đã có một cách nào đó similar question vào một ngày khác.

nếu xây dựng

val if cond else alt 

Chẳng phải rất hoan nghênh (ít nhất là bởi cộng đồng SO) và một trong những ưu tiên là:

if cond: 
    val 
else: 
    alt 

Bạn có thể nhận được kết luận của riêng bạn. :)

-1

Yikes. Không thể đọc được. Đối với tôi pythonic có nghĩa là dễ đọc.

return isUp and "Up" or "Down" 

Âm thanh điều bạn sẽ làm trong perl.

9

Bạn nên đọc Using the and-or trick (phần 4.6.1) của Lặn vào Python bởi Mark Pilgrim.Nó chỉ ra rằng và-hoặc lừa có những cạm bẫy lớn bạn nên biết.

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