2010-07-03 39 views
5

Tôi đang chạy một ứng dụng nhỏ trên Google App Engine bằng Python. Trong mô hình tôi có một thuộc tính kiểu DateTimeProperty, là datetime.datetime. Khi nó được tạo ra không có giá trị (tức là "Không"). Tôi muốn so sánh nếu datetime.datetime đó là None, nhưng tôi không thể.So sánh nếu datetime.datetime tồn tại hoặc None

if object.updated_date is None or object.updated_date >= past: 
    object.updated_date = now 

Cả updated_datepast là datetime.datetime.

Tôi gặp lỗi sau.

TypeError: can't compare datetime.datetime to NoneType

Cách chính xác để làm điều này là gì?

+0

Không có cách nào mà bạn có thể nhận được lỗi đó trên dòng đó nếu cả hai là trường hợp của 'datetime.datetime'. –

Trả lời

3

Bạn muốn and, không phải or.

Bạn cũng có thể muốn sử dụng is None.

EDIT:

Vì bạn đã xác định rằng object.updated_datekhôngNone, chỉ có khả năng khác này là pastNone.

5

Có lẽ bạn muốn tìm:

if object.updated_date and object.updated_date >= past: 

Nếu đó là truthy (trong đó hàm ý không null), chúng tôi kiểm tra xem nó là cũng> = qua. Điều này sử dụng đánh giá ngắn mạch, có nghĩa là điều kiện thứ hai không được kiểm tra nếu điều kiện đầu tiên là giả.

+0

Nó không kiểm tra nullness, nó sẽ kiểm tra sai, nó sẽ bắt được' None', nhưng nó cũng sẽ bắt được một số giá trị không phải '' '' '' –

+0

True Tôi đã làm rõ ngay bây giờ. –

4

Cho rằng các cuộc thảo luận trước đó dường như đã chứng minh rằng một trong các biến có thể là None, một cách tiếp cận sẽ được (giả sử bạn muốn thiết lập object.updated_date khi một trong hai biến là None):

if None in (past, object.updated_date) or object.updated_date >= past: 
    object.updated_date = now 

điểm là kiểm tra None in (past, object.updated_date) có thể là thủ công hơn thay thế ngữ nghĩa tương đương (past is None or object.update_date is None) (được cho là một epsilon dễ đọc hơn nhờ độ nén tốt hơn của nó, nhưng nó là, tất nhiên, một vấn đề có thể tranh cãi về phong cách).

Là một vấn đề không thể biện hộ được ;-), tôi khuyên bạn nên chống lại việc sử dụng tên được đặt sẵn làm tên cho các biến của riêng bạn (và chức năng, v.v.) - object trong tên trong ngữ cảnh này rõ ràng đang được sử dụng cho mục đích của riêng bạn. Sử dụng obj thay vào đó là ngắn gọn hơn, vẫn có thể đọc được (cho là nhiều hơn ;-), và không có nhược điểm. Bạn sẽ không bị "cắn" trong bất kỳ trường hợp nào bằng cách thực hành "shadowing" được xây dựng với tên của riêng bạn, nhưng cuối cùng nó sẽ xảy ra (khi bạn cần ý nghĩa bình thường của tên bóng tối trong một số sau này hoạt động bảo trì bình thường) và bạn có thể ở trong một tình huống gỡ rối khó hiểu sau đó; trong khi đó, bạn có nguy cơ gây nhầm lẫn cho người đọc/người duy trì khác ... và đang hoàn toàn không có lợi thế để đổi lấy những nhược điểm này.

Tôi nhận ra rằng nhiều tên Python của built-in là một "phiền toái hấp dẫn" theo nghĩa này ... file, object, list, dict, set, min, max ...tất cả các tên rõ ràng hấp dẫn cho "một tập tin", "một đối tượng", "một danh sách`, vv Nhưng, nó là đáng giá để tìm hiểu để chống lại sự cám dỗ đặc biệt này! -)

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