2010-05-04 6 views
14

मैं वर्तमान में assert कथन का उपयोग कर रहा हूं isinstance के साथ। क्योंकि datetimedate का उप-वर्ग है, मुझे यह भी जांचना होगा कि यह datetime का उदाहरण नहीं है। निश्चित रूप से एक बेहतर तरीका है?मुझे यह कैसे जांचना चाहिए कि दिया गया तर्क एक datetime.date ऑब्जेक्ट है?

from datetime import date, datetime 

def some_func(arg): 
    assert isinstance(arg, date) and not isinstance(arg, datetime),\ 
     'arg must be a datetime.date object' 
    # ... 
+0

मुझे लगता है कि बहुरूपता का विचार यह है कि उप-वर्गों के उदाहरण बेस क्लास के उदाहरणों के साथ संगत होते हैं। इस प्रकार, यह केवल यह समझ में आता है कि 'डेटटाइम' ऑब्जेक्ट्स 'दिनांक' के उदाहरण हैं, इसलिए मुझे नहीं लगता कि आप जो करने की कोशिश कर रहे हैं, उसके लिए एक बेहतर तरीका है। – avpx

उत्तर

28

मैं डॉन 'टी उपवर्गों के उदाहरण खारिज के लिए आपकी प्रेरणा को समझने (यह देखते हुए कि परिभाषा से वे सब व्यवहार सुपर क्लास का समर्थन करता है समर्थन करते हैं!), लेकिन यह है कि यदि वास्तव में आप क्या कर पर जोर देते हैं, तो:

if type(arg) is not datetime.date: 
    raise TypeError('arg must be a datetime.date, not a %s' % type(arg)) 

assert का उपयोग न करें सैनिटी चेक को छोड़कर विकास के दौरान (जब आप python -o के साथ दौड़ते हैं तो यह नो-ऑप में बदल जाता है), और गलत प्रकार का अपवाद नहीं बढ़ाएं (जैसे AssertionError जब TypeError स्पष्ट रूप से आपका मतलब है)।

एक सख्ती से निर्दिष्ट सही प्रकार प्राप्त करने के लिए एक ध्वनि रास्ता isinstance का उपयोग करते हुए और फिर एक विशिष्ट उपवर्ग को छोड़कर नहीं है उपवर्गों के साथ बाहर रखा: सब के बाद, उपयोगकर्ता पूरी तरह से अच्छी तरह से उपवर्ग datetime.date और जोड़ सकते हैं जो कुछ भी यह है तुम इतने से बचने के लिए रख रहे हैं विशेष रूप से datetime.datetime के उदाहरण का त्याग करके -!)

+0

धन्यवाद! मैं आमतौर पर इस प्रकार की जांच करने के बारे में नहीं सोचूंगा, लेकिन जैसा कि मैंने दूसरी प्रतिक्रिया पर पोस्ट किया है: मैं दिन-प्रति-दिन डेटा के लिए ग्राफ़ प्लॉटिंग फ़ंक्शन लिख रहा हूं, और यदि आप डेटाटाइम ऑब्जेक्ट में पास करते हैं, तो जानकारी थूक गड़बड़ है (लेकिन पहली नज़र में सही लग सकता है)।अगर मेरे कार्य के निष्पादन के दौरान कहीं अपवाद उठाया गया तो मैं परेशान नहीं होता, लेकिन जब मैंने गलती से 'डेटाटाइम' में पारित किया तो मुझे भ्रमित कर दिया और मैं इसे अपनी लाइब्रेरी के उपयोगकर्ता को नहीं करना चाहता। – rmh

+0

ओह, और 'AssertionError' के मेरे दुरुपयोग को इंगित करने के लिए धन्यवाद। एक 'TypeError' वास्तव में मेरा मतलब था। – rmh

+1

यह अब और काम नहीं कर रहा है। – sorin

3

अजगर जिस तरह से यह जांच करने के लिए, बस आगे बढ़ो और अपने कोड में यह क्या करने की जरूरत करते हैं, और अगर वस्तु एक आवश्यक विधि या कुछ और नहीं है, कोड एक साथ विफल हो जाएगा नहीं है उस बिंदु पर अपवाद जहां उस विधि को बुलाया जाएगा। इसे duck typing कहा जाता है और यह पाइथन को इतना लचीला बनाता है।

अब, यदि आप वास्तव में datetime.datetime ऑब्जेक्ट स्वीकार नहीं कर सकते हैं ... अच्छा, आप क्यों नहीं कर सकते? datetime कुछ भी कर सकता है date कर सकता है, इसलिए मैं कल्पना नहीं कर सकता कि datetime, या वास्तव में date को अस्वीकार करने के लिए आपको क्या कारण होगा।

आप वास्तव में बहुत एक अच्छा ऐसा करने के लिए कारण (मैं एक डिबगिंग चीज के रूप में हो सकता है लगता है, लेकिन फिर भी, मैं यह नहीं मिलता है ...) है, तो:

assert type(arg) == datetime.date 
+1

मैं दिन-दर-दिन डेटा के लिए एक ग्राफ़ प्लॉटिंग फ़ंक्शन लिख रहा हूं, और यदि आप 'डेटाटाइम' ऑब्जेक्ट में पास करते हैं, तो जो जानकारी थूकती है वह अस्पष्ट है (लेकिन पहली नज़र में सही दिख सकती है)। इस कारण से, मैं डेटा को थूकने के बजाय अपवाद उठाऊंगा जो मेरी लाइब्रेरी के उपयोगकर्ता को थोड़ी देर के लिए अपने सिर को परेशान और खरोंच कर सकता है। अगर कहीं अपवाद उठाया गया तो मैं ऐसा करने से परेशान नहीं होता, लेकिन चूंकि यह किसी ऐसे व्यक्ति को भ्रमित कर सकता है जो गलती से 'डेटाटाइम' का उपयोग करता है, तो मैं अपवाद उठाउंगा। – rmh

+0

आपके संपादन के लिए धन्यवाद; उस उदाहरण में मदद की! मुझे नहीं पता कि मैंने 'टाइप() 'का उपयोग क्यों नहीं किया। – rmh

5

आपकी समस्या है कि ग्राफ क्योंकि यह एक दिन के भिन्न उपयोग कर रहा है wonky चला जाता है, आपको लगता है कि अन्य तरीकों जैसे में के लिए परीक्षण कर सकते हैं hasattr(arg, 'hour')datetime उदाहरण और date उदाहरण के बीच अंतर करता है।

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