2013-04-17 31 views
7

Trong Python chúng ta có thể làm điều này:Python - Để đánh giá logic trong "nếu" tuyên bố

if True or blah: 
    print("it's ok") # will be executed 

if blah or True: # will raise a NameError 
    print("it's not ok") 

class Blah: 
    pass 
blah = Blah() 

if blah or blah.notexist: 
    print("it's ok") # also will be executed 
  • Ai có thể chỉ cho tôi tài liệu về tính năng này?
  • Đây có phải là chi tiết hoặc tính năng triển khai của ngôn ngữ không?
  • Có phong cách mã hóa tốt để khai thác tính năng này không?
+1

Lệnh 'blah hoặc TRUE' ta không huy động một ngoại lệ đối với tôi là, nó in. –

+0

Có thể đó là một sự may mắn? –

+3

@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ế. –

Trả lời

21

Các orandngắ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, ychỉ đá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.

5

này được gọi là ngắn mạch và là một tính năng của ngôn ngữ:

http://docs.python.org/2/tutorial/datastructures.html#more-on-conditions

Các toán tử Boolean andor được cái gọi là nhà khai thác ngắn mạch: lập luận của họ được đánh giá từ trái sang phải, và đánh giá dừng lại ngay khi kết quả được xác định. Ví dụ, nếu A và C là true nhưng B là sai, A và B và C không đánh giá biểu thức C. Khi được sử dụng như một giá trị chung và không phải là Boolean, giá trị trả về của một toán tử ngắn mạch là đối số được đánh giá.

2

Đó là cách các nhà khai thác các nhà khai thác hợp lý, đặc biệt trong công việc or python: ngắn đánh giá mạch.

Để giải thích nó tốt hơn, hãy xem xét những điều sau đây:

if True or False: 
    print('True') # never reaches the evaluation of False, because it sees True first. 

if False or True: 
    print('True') # print's True, but it reaches the evaluation of True after False has been evaluated. 

Để biết thêm thông tin thấy như sau:

1

Với toán tử or, giá trị được đánh giá từ trái sang phải. Sau khi một giá trị đánh giá là True, toàn bộ câu lệnh đánh giá là True (do đó không có giá trị nào được đánh giá).

  • Official documentation
  • Đó là một tính năng của ngôn ngữ
  • Không có gì sai với việc sử dụng chức năng của nó
Các vấn đề liên quan