[Python] कैसे पता चलेगा कि किसी ऑब्जेक्ट में पायथन में कोई विशेषता है या नहीं


Answers

जैसा कि जारेट हार्डी ने जवाब दिया, hasattr चाल करेगा। हालांकि, मैं जोड़ना चाहता हूं कि पाइथन समुदाय में कई लोग "लीप से पहले देखो" (एलबीवाईएल) की बजाय "अनुमति से क्षमा मांगना आसान" (ईएएफपी) की रणनीति की सलाह देते हैं। इन संदर्भों को देखें:

ईएएफपी बनाम एलबीवाईएल (पुनः था: अब तक थोड़ा निराश)
ईएएफपी बनाम एलबीवाईएल @ कोड एक पाइथोनिस्टा की तरह: इडियोमैटिक पायथन

अर्थात:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

... को प्राथमिकता दी जाती है:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()
Question

क्या पाइथन में यह निर्धारित करने का कोई तरीका है कि किसी ऑब्जेक्ट में कुछ विशेषता है या नहीं? उदाहरण के लिए:

>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

आप यह कैसे बता सकते हैं कि इसका उपयोग करने से पहले विशेषता property नहीं?




मैं सुझाव देना चाहता हूं कि इससे बचें:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

उपयोगकर्ता @jpalecek ने इसका उल्लेख किया: यदि doStuff() अंदर कोई AttributeError doStuff() होती है, तो आप खो जाते हैं।

शायद यह दृष्टिकोण बेहतर है:

try:
    val = a.property
except AttributeError:
    otherStuff()
else:
    doStuff(val)



संपादित करें : इस दृष्टिकोण में गंभीर सीमा है। यदि वस्तु एक पुनरावर्तनीय है तो यह काम करना चाहिए। कृपया नीचे दी गई टिप्पणियों की जांच करें।

यदि आप मेरे जैसे पायथन 3.6 या उच्चतर का उपयोग कर रहे हैं तो यह जांचने का एक सुविधाजनक विकल्प है कि किसी ऑब्जेक्ट में कोई विशेष विशेषता है या नहीं:

if 'attr1' in obj1:
    print("attr1 = {}".format(obj1["attr1"]))

हालांकि, मुझे यकीन नहीं है कि अभी सबसे अच्छा तरीका कौन सा है। hasattr() का उपयोग करके getattr() का उपयोग कर या getattr() उपयोग करना। टिप्पणियाँ स्वागत है।




मुझे लगता है कि आप जो खोज रहे हैं वह हैट्टर है । हालांकि, अगर आप पाइथन गुणों का पता लगाना चाहते हैं तो मैं इस तरह कुछ सुझाऊंगा -

try:
    getattr(someObject, 'someProperty')         
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

यहां नुकसान यह है कि गुणों में विशेषता त्रुटियां __get__ कोड भी पकड़ी जाती हैं।

अन्यथा, करते हैं-

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

डॉक्स: http://docs.python.org/library/functions.html
चेतावनी:
मेरी सिफारिश का कारण यह है कि हैट्रर गुणों का पता नहीं लगाता है।
लिंक: http://mail.python.org/pipermail/python-dev/2005-December/058498.html / http://mail.python.org/pipermail/python-dev/2005-December/058498.html