2012-04-24 42 views
14

Tiếp theo "nguyên tắc Samurai", tôi đang cố gắng để làm điều này trên các chức năng của tôi, nhưng có vẻ như nó là sai ...tăng tuyên bố trên một biểu thức điều kiện

return <value> if <bool> else raise <exception> 

Có cách nào khác "đẹp" để làm điều này ? Cảm ơn

+0

* Samurai * ở đây là gì? Bạn nghĩ gì về việc thêm một số chi tiết? – Wolf

+1

Nguyên tắc Samurai - Trở lại thắng lợi, hoặc không hề. Nếu một hàm thỏa mãn các trách nhiệm của nó, trả về đối tượng kết quả thích hợp, và nếu nó không ném một ngoại lệ. –

+0

Ồ, tôi hiểu rồi. Có lẽ một số liên kết sẽ là tốt, chẳng hạn như [Nguyên tắc Samurai] (http://c2.com/cgi/wiki?SamuraiPrinciple) – Wolf

Trả lời

14

Inline/ternary if là một biểu thức chứ không phải là câu lệnh. Nỗ lực của bạn có nghĩa là "nếu bool, giá trị trả về, thì trả về kết quả là raise expression" - điều đó là vô nghĩa, bởi vì raise exception chính nó là một câu lệnh không phải là một biểu thức.

Không có cách nào để thực hiện nội tuyến này và bạn không nên muốn. Làm điều đó một cách rõ ràng:

if not bool: 
    raise MyException 
return value 
1

Vâng, bạn có thể kiểm tra cho bool riêng:

if expr: raise exception('foo') 
return val 

Bằng cách đó, bạn có thể kiểm tra cho expr trước đó.

1

tôi muốn làm điều đó với khẳng định, do đó bạn nhấn mạnh rằng thành viên đó phải là, giống như một hợp đồng.

>>> def foo(self): 
...  assert self.value, "Not Found" 
...  return self.value 
+0

Bằng cách đó bạn sẽ không nâng cao một sự thực thi cụ thể, phải không? –

+0

Tôi cũng nhận thấy rằng khẳng định là, giống như trong các ngôn ngữ khác, chỉ sao chép khi vào __debug__ vì vậy ig bạn tìm thấy một lỗi trên thời gian chạy, nó sẽ khẳng định nó là tốt? –

+0

Đây không phải là rất pythonic, và nó được đề cập trước khi bạn chạy Python thông dịch mà không có tùy chọn đầu tiên các khẳng định được bỏ qua ... P.D: -O: tối ưu hóa tạo ra bytecode một chút; cũng PYTHONOPTIMIZE = x –

11

Nếu bạn hoàn toàn muốn raise trong một biểu thức, bạn có thể làm

def raiser(ex): raise ex 

return <value> if <bool> else raiser(<exception>) 

này "cố gắng" để trở về giá trị trả về của raiser(), đó sẽ là None, nếu không có điều kiện raise trong hàm.

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