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()
)?
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. –
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