Các or
và and
ngắn mạch, xem tài liệu Boolean operations:
Khái niệm x and y
đánh giá lại đầu tiên x
; nếu x
là sai, giá trị của nó được trả về; nếu không, y
được đánh giá và giá trị kết quả được trả về.
Biểu thức x or y
đánh giá đầu tiên x
; nếu x
là đúng, giá trị của nó được trả về; nếu không, y
được đánh giá và giá trị kết quả được trả về.
Lưu ý như thế nào, cho and
, y
là chỉ đánh giá nếu x
để đánh giá một giá trị True. Ngược lại, đối với or
, y
chỉ được đánh giá nếu x
được đánh giá thành giá trị False.
Đối với biểu thức đầu tiên True or blah
, điều này có nghĩa là blah
không bao giờ được đánh giá, vì phần đầu tiên đã là True
.
Bên cạnh đó, tùy chỉnh của bạn Blah
lớp được coi Đúng:
Trong bối cảnh hoạt động Boolean, và cũng có khi biểu thức được sử dụng bởi các báo cáo kiểm soát dòng chảy, các giá trị sau đây được hiểu như sai: False
, None
, số không của tất cả các loại, và các chuỗi rỗng và các thùng chứa (bao gồm các chuỗi, bộ, danh sách, từ điển, bộ và frozensets). Tất cả các giá trị khác được hiểu là đúng. (Xem __nonzero__()
phương pháp đặc biệt cho một cách để thay đổi điều này.)
Kể từ khi lớp học của bạn không thực hiện một phương pháp __nonzero__()
(và cũng không một phương pháp __len__
), nó được coi là True
như xa như biểu thức boolean có liên quan.
Trong biểu thức blah or blah.notexist
, blah
là như vậy, và blah.notexist
không bao giờ được đánh giá.
Tính năng này được sử dụng khá thường xuyên và có hiệu quả bởi các nhà phát triển có kinh nghiệm, thường xuyên nhất để xác định giá trị mặc định:
some_setting = user_supplied_value or 'default literal'
object_test = is_it_defined and is_it_defined.some_attribute
Đừng cảnh giác với chaining được kết những điều này và sử dụng một conditional expression thay vì khi áp dụng.
Lệnh 'blah hoặc TRUE' ta không huy động một ngoại lệ đối với tôi là, nó in. –
Có thể đó là một sự may mắn? –
@TimS .: chỉ khi bạn xác định 'blah' * đầu tiên *. Lưu ý rằng 'blah' là * chưa được xác định * ở phía trên cùng của ví dụ, do đó, một' NameError' được nâng lên thay thế. –