2011-12-13 43 views
10

Nếu tôi thử đoạn mã sau (bằng Python 3.2.2),Python: trường hợp ngoại lệ trong tập

def f(): 
    raise Exception 

x = f() 

sau đó có vẻ như là x hoang sơ - nó hoặc là vẫn không xác định hoặc giữ bất kỳ giá trị nó đã có trước đó. Hành vi này có được đảm bảo bất cứ khi nào phía bên tay phải của một nhiệm vụ ném một ngoại lệ? Tôi nhận ra đây là một câu hỏi rất cơ bản, nhưng tôi không thể tìm thấy nhiều thông tin về cách phân công chính xác. Nói chung, toàn bộ phía bên tay phải luôn được đánh giá trước khi bất cứ điều gì liên quan đến việc chuyển nhượng xảy ra? Điều này có đúng khi sử dụng setattr, chỉ định cho một phần tử của danh sách hoặc sử dụng giải nén tuple (tức là một cái gì đó như x, y = y, f())?

+2

Theo như tôi biết, điều này là phù hợp (chỉ thử nghiệm trên PyPy, nó giống ở đó), nhưng tôi đã không nhìn thấy bất kỳ tuyên bố rõ ràng rằng nó phải là trường hợp. –

+0

Vâng, sự vắng mặt của một đặc tả chính thức làm cho điều này một chút khó khăn (các C, C++, Java, JavaScript, vv guys chỉ có thể trích dẫn một spec chính thức). Nhưng thực tế, không ai trong số các triển khai đi chệch hướng và hành vi là đủ quan trọng mà các thực hiện mà làm lệch sẽ được gọi là bị hỏng. – delnan

Trả lời

12

tham khảo ngôn ngữ Python định này:

http://docs.python.org/reference/expressions.html#evaluation-order

Python đánh giá biểu thức từ trái sang phải. Lưu ý rằng trong khi đánh giá một nhiệm vụ, phía bên phải được đánh giá trước bên trái.

Phía bên phải được đánh giá, sau đó phía bên trái, sau đó chính việc gán sẽ diễn ra. Do đó,

def x(): 
    print "x" 
    fail() 

def y(): 
    print "y" 
    fail() 

x().a = y() 

được đảm bảo in "y" và không thành công với NameError; nó sẽ không bao giờ tăng "x", hoặc cố gắng chuyển nhượng bất kỳ.

0

Tài liệu Python liên quan đến không nói rõ ràng rằng phía bên tay trái của bài tập không bao giờ được chạm vào khi bên tay phải tăng ngoại lệ, nhưng sau khi đọc bài viết này, có vẻ như là cách duy nhất để tránh việc chuyển nhượng là để nâng cao một ngoại lệ.

Kết luận: phía bên tay trái của một bài tập không bao giờ chạm vào nếu một ngoại lệ xảy ra

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