पायथन ऑब्जेक्ट के प्रकार का निर्धारण करें
किसी वस्तु के प्रकार का निर्धारण type
>>> obj = object()
>>> type(obj)
<class 'object'>
हालांकि यह काम करता है, डबल अंडरस्कोर विशेषताओं से बचें, जैसे __class__
- वे शब्दार्थ रूप से सार्वजनिक नहीं हैं, और, जबकि शायद इस मामले में, अंतर्निहित कार्यों में आमतौर पर बेहतर व्यवहार नहीं होता है।
>>> obj.__class__ # avoid this!
<class 'object'>
प्रकार की जाँच
क्या यह निर्धारित करने का एक सरल तरीका है कि एक चर एक सूची, शब्दकोश, या कुछ और है? मुझे एक वस्तु वापस मिल रही है जो या तो टाइप हो सकती है और मुझे अंतर बताने में सक्षम होने की आवश्यकता है।
खैर यह एक अलग सवाल है, प्रकार का उपयोग न करें - उपयोग करें isinstance
:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
यह उस मामले को कवर करता है जहां आपका उपयोगकर्ता सबक्लासिंग द्वारा कुछ चतुर या समझदार हो सकता है str
- लिस्कोव प्रतिस्थापन के सिद्धांत के अनुसार, आप अपने कोड को तोड़ने के बिना उपवर्ग उदाहरणों का उपयोग करने में सक्षम होना चाहते हैं - और इसका isinstance
समर्थन करता है।
सार का उपयोग करें
इससे भी बेहतर, आप एक विशिष्ट एब्सट्रैक्ट बेस क्लास की तलाश collections
कर सकते हैं numbers
:
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
या बस स्पष्ट रूप से टाइप-चेक न करें
या, शायद सबसे अच्छा, बतख-टाइपिंग का उपयोग करें, और अपने कोड को स्पष्ट रूप से टाइप-चेक न करें। बत्तख-टाइपिंग अधिक लालित्य और कम वाचालता के साथ लिस्कोव प्रतिस्थापन का समर्थन करता है।
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
निष्कर्ष
- उपयोग
type
करने के लिए वास्तव में एक उदाहरण वर्ग मिलता है।
isinstance
वास्तविक उपवर्गों या पंजीकृत सार के लिए स्पष्ट रूप से जांच करने के लिए उपयोग करें ।
- और सिर्फ टाइप-चेकिंग से बचें जहां यह समझ में आता है।