2010-07-03 20 views
5

Python ile Google App Engine'de küçük bir uygulama çalıştırıyorum. Modelde, datetime.datetime olan DateTimeProperty türünde bir özellik var. Oluşturulduğunda hiçbir değer yoktur (yani "Yok"). Bu datetime.datetime öğesinin None olup olmadığını karşılaştırmak istiyorum, ancak yapamam.datetime.datetime var mı yoksa Yok

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

Hem updated_date ve past datetime.datetime olduğunu.

Aşağıdaki hatayı alıyorum. Bunu yapmanın doğru yolu

TypeError: can't compare datetime.datetime to NoneType

nedir?

+0

Bu hatayı almanın bir yolu yok. her ikisi de 'datetime.datetime' örnekleriyse, bu satırda –

cevap

3

and, or değil.

Ayrıca is None'u da kullanmak isteyebilirsiniz.

DÜZENLEME: Eğer object.updated_datedeğilNone olduğunu tespit ettik beri

, bu sadece diğer olasılık pastNone olmasıdır.

5

Belki demek:

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

o (boş değil anlamına gelir) truthy varsa, bunu da> = geçmiş olduğunu kontrol edin. Bu kısa devre değerlendirmesini kullanır, bu da eğer birincisi falsi ise ikinci koşulun kontrol edilmediği anlamına gelir.

+0

Boşluğu kontrol etmez, sahteliği kontrol eder. Bu 'Yok' u yakalar, ama aynı zamanda bazı "Olmayan" değerleri de yakalar. –

+0

True @Ignacio, şimdi açıklığa kavuştum. –

4

önceki tartışma değişkenlerin ya None olabileceğini sağlamış görünüyor göz önüne alındığında, bir yaklaşım (eğer değişkenlerin ya None olduğunda object.updated_date ayarlamak istediğiniz varsayarak) olacaktır:

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

noktası None in (past, object.updated_date) numaralı kontrolün, semantik olarak denk bir alternatif olan (past is None or object.update_date is None)'dan daha elverişli olması (daha iyi kompaktlığı sayesinde daha fazla okunabilir bir epsilon olabilir, ama elbette, tartışılabilir bir stil meselesi) olabilir. Bir kenara

ve stil bir az tartışılabilir madde ;-), şiddetle (ve fonksiyonlar vs.) kendi değişkenler için adları gibi yerleşik ins' adları kullanarak karşı tavsiye - object böyle almanın doğasında olan Bu bağlamda açıkça kendi amaçlarınız için kullanılıyor. Bunun yerine, obj'u kullanmak daha kısa, yine de okunabilir (biraz daha fazla ;-), ve dezavantajı yoktur). Herhangi bir durumda, "gömülü" yerleşik isimlerin sizin adınıza "gölgelenme" uygulamasıyla "ısırılmış" olma olasılığınız yoktur, ancak sonunda gerçekleşecektir (bazı durumlarda gölgeli ismin normal anlamını bildiğiniz gibi) Daha sonra sıradan bakım işlemi) ve kafa karıştırıcı bir hata ayıklama durumunda olabilirsiniz; Bu arada, diğer okurları/bakıcıları kafa karıştırıyorsunuz ve bu dezavantajlar karşısında kesinlikle hiçbir avantaj elde edemiyorsunuz.

Python'ın yerleşik ins' isimlerin birçoğu bu anlamda bir "çekici sıkıntı" ... file, object, list, dict, set, min, max olduğunu fark ..."bir dosya", "bir nesne", "bir liste", vb. için görünen tüm çekici adlar. Ama, bu özel günaha karşı direnmeyi öğrenmeye değer! -)

İlgili konular