2010-07-03 20 views
5

मैं पाइथन के साथ Google App Engine पर एक छोटा ऐप चला रहा हूं। मॉडल में मेरे पास डेटटाइमप्रोपर्टी टाइप की एक संपत्ति है, जो datetime.datetime है। जब इसे बनाया जाता है तो कोई मूल्य नहीं होता है (यानी "कोई नहीं")। मैं तुलना करना चाहता हूं अगर वह datetime.datetime कोई नहीं है, लेकिन मैं नहीं कर सकता।तुलना करना अगर datetime.datetime मौजूद है या कोई नहीं

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

दोनों updated_date और past datetime.datetime है।

मुझे निम्न त्रुटि मिलती है।

TypeError: can't compare datetime.datetime to NoneType

ऐसा करने का सही तरीका क्या है?

+0

कोई त्रुटि नहीं है कि आप उस त्रुटि को प्राप्त कर सकें उस रेखा पर यदि दोनों 'datetime.datetime' के उदाहरण हैं। –

उत्तर

3

आप and, or नहीं चाहते हैं।

आप is None का उपयोग भी करना चाह सकते हैं।

संपादित करें:

जब से तुम यह पाया है कि object.updated_date नहीं None है, यह केवल अन्य संभावना है कि pastNone है।

5

शायद आप मतलब है:

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

यदि यह truthy है (जो रिक्त नहीं निकलता है), हम जांच करें कि यह भी> = अतीत है। यह शॉर्ट-सर्किट मूल्यांकन का उपयोग करता है, जिसका अर्थ है कि अगर पहली बार झूठी होती है तो दूसरी स्थिति की जांच नहीं की जाती है।

+0

यह शून्यता की जांच नहीं करता है, यह झूठ बोलता है। यह' कोई नहीं 'पकड़ लेगा, लेकिन यह कुछ गैर-'किसी भी मूल्य को भी पकड़ लेगा। –

+0

True , @Ignacio। मैंने अब स्पष्ट किया है। –

4

यह देखते हुए कि पिछली चर्चा की स्थापना की है चर के दोनों None हो सकता है कि लगता है, एक दृष्टिकोण होगा (यह मानते हुए आप object.updated_date स्थापित करने के लिए जब चर के दोनों None है चाहते हैं) हो:

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

बिंदु यह है कि चेक None in (past, object.updated_date) अर्थात् समकक्ष वैकल्पिक (past is None or object.update_date is None) (तर्कसंगत रूप से एक बेहतर ईपीएसलॉन बेहतर पठनीयता के लिए अधिक पठनीय धन्यवाद की तुलना में आसान हो सकता है, लेकिन यह निश्चित रूप से शैली का एक तर्कसंगत मामला है)।

एक तरफ के रूप में, और स्टाइल का एक कम तर्कसंगत मामला ;-), मैं अपने स्वयं के चर (और फ़ंक्शंस इत्यादि) के नाम के रूप में अंतर्निर्मित नामों का उपयोग करने की दृढ़ता से अनुशंसा करता हूं - object इस तरह का एक निर्मित- नाम में जो इस संदर्भ में स्पष्ट रूप से आपके अपने उद्देश्यों के लिए उपयोग किया जा रहा है। obj का उपयोग करना अधिक संक्षेप में है, अभी भी पठनीय (तर्कसंगत रूप से अधिक ;-), और इसका कोई नकारात्मक पक्ष नहीं है। आप किसी भी मामले में किसी भी मामले में "काटने" की संभावना नहीं है, जो आपके स्वयं के नामों के "शेडिंग" नामों के इफफी अभ्यास से है, लेकिन आखिर में ऐसा होगा (जैसा कि आपको कुछ के दौरान छायादार नाम के सामान्य अर्थ की आवश्यकता होती है बाद में सामान्य रखरखाव ऑपरेशन) और आप तब भ्रमित डीबगिंग स्थिति के लिए हो सकते हैं; इस बीच, आप अन्य पाठकों/रखरखाव को भ्रमित करने का जोखिम उठाते हैं ... और इन नुकसानों के बदले में बिल्कुल कोई फायदा नहीं हो रहा है।

मुझे लगता है कि अजगर के अंतर्निहित-इन के नाम से कई एक "आकर्षक उपद्रव" इस अर्थ में ... file, object, list, dict, set, min, max रहे हैं ..."एक फ़ाइल", "ऑब्जेक्ट", "एक सूची" इत्यादि के लिए सभी स्पष्ट रूप से आकर्षक नाम, लेकिन, इस विशेष प्रलोभन का विरोध करना सीखना फायदेमंद है! -)

संबंधित मुद्दे