2014-07-26 3 views
5

बनाम मैं हाल ही में कुछ tweets और hasattr के बारे में python documentation पढ़ने किया गया है और यह कहते हैं:अजगर hasattr getattr

hasattr (वस्तु, नाम)

तर्क एक वस्तु और एक स्ट्रिंग है। नतीजा सही है यदि स्ट्रिंग का नाम ऑब्जेक्ट के गुणों में से एक है, तो गलत नहीं है। (यह getattr (वस्तु, नाम) को कॉल करने और क्या यह एक AttributeError या नहीं उठाती देखकर कार्यान्वित किया जाता है।)

पायथन में एक आदर्श वाक्य है कि का कहना है कि है आसान माफी के लिए पूछने की भी नहीं है अनुमति से जहां मैं आमतौर पर सहमत हूं।

import timeit 
definition="""\ 
class A(object): 
    a = 1 
a = A() 
""" 

stm="""\ 
hasattr(a, 'a') 
""" 
print timeit.timeit(stmt=stm, setup=definition, number=10000000) 

stm="""\ 
getattr(a, 'a') 
""" 
print timeit.timeit(stmt=stm, setup=definition, number=10000000) 
परिणामों के साथ

:

$ python test.py 
hasattr(a, 'a') 
1.26515984535 

getattr(a, 'a') 
1.32518696785 

मैं भी करने की कोशिश की तो क्या होता है विशेषता नहीं करता

मैं एक बहुत साधारण अजगर कोड के साथ इस मामले में एक प्रदर्शन परीक्षण करने की कोशिश की अस्तित्व में नहीं है और गेटैटर और हैट्टर के बीच अंतर बड़ा है। तो मैंने अब तक जो देखा है वह है कि गेटैटर हैशर की तुलना में धीमी है, लेकिन प्रलेखन में यह कहता है कि यह गेटैटर को कॉल करता है।

मैंने hasattr और getattr की CPython कार्यान्वयन खोज की है और ऐसा लगता है कि दोनों अगले फ़ंक्शन को कॉल करें:

v = PyObject_GetAttr(v, name); 

लेकिन वहाँ getattr में hasattr कि शायद यह धीमा हो जाता है की तुलना में अधिक बॉयलरप्लेट है।

क्या कोई जानता है कि दस्तावेज़ में हम क्यों कहते हैं कि हैटट्रर गेटैटर कहता है और हम उपयोगकर्ताओं को हैशर के बजाय गेटैटर का उपयोग करने के लिए प्रोत्साहित करते हैं जब यह वास्तव में प्रदर्शन के कारण नहीं होता है? सिर्फ इसलिए कि यह अधिक पाइथनिक है?

शायद मैं कुछ अपने परीक्षण :)

धन्यवाद में गलत कर रहा हूँ,

राउल

+3

यहाँ अंतर प्रदर्शन नहीं है। आप 5 नैनोसेकंड की तरह बात कर रहे हैं। आप पाइथन का उपयोग करके हजारों बार खो देते हैं। यहां अंतर यह है कि आपको क्या करना है इसके लिए कौन सा सही है। – cHao

+0

प्रदर्शन अंतर बिंदु नहीं था। मुझे समझ में नहीं आया कि दस्तावेज़ीकरण में टिप्पणी क्यों कह रही है कि इसे लागू करने के लिए इसे लागू किया गया था। – raulcumplido

+0

शायद एक बिंदु पर इसे 'गेटैटर' कहा गया था, और अब यह नहीं है, लेकिन कोई भी दस्तावेज़ अपडेट नहीं किया गया है ...? स्पष्ट रूप से, हालांकि, यह ऐसा बयान है जो एपीआई दस्तावेज में किसी भी तरह से संबंधित नहीं है। दस्तावेज़ों को समझा जाना चाहिए कि क्या होता है, यह नहीं होता कि यह कैसे होता है, जब तक कि "कैसे" "अनिवार्य" का एक अनिवार्य हिस्सा न हो। – cHao

उत्तर

10

प्रलेखन प्रोत्साहित नहीं करता है, प्रलेखन बस स्पष्ट कहा गया है। hasattr इस तरह कार्यान्वित किया गया है, और एक संपत्ति गेटटर से AttributeError फेंकने से यह विशेषता दिखाई दे सकती है जैसे विशेषता मौजूद नहीं है। यह एक महत्वपूर्ण जानकारी है, और यही कारण है कि यह दस्तावेज़ीकरण में स्पष्ट रूप से कहा गया है। उदाहरण के लिए इस कोड पर विचार करें:

class Spam(object): 
    sausages = False 

    @property 
    def eggs(self): 
     if self.sausages: 
      return 42 
     raise AttributeError("No eggs without sausages") 

    @property 
    def invalid(self): 
     return self.foobar 


spam = Spam() 
print(hasattr(Spam, 'eggs')) 

print(hasattr(spam, 'eggs')) 

spam.sausages = True 
print(hasattr(spam, 'eggs')) 

print(hasattr(spam, 'invalid')) 

परिणाम है

True 
False 
True 
False 

कि Spam वर्ग eggs के लिए एक संपत्ति वर्णनकर्ता है, लेकिन जब से गेटर AttributeErrornot self.sausages है, तो उस वर्ग के उदाहरण को जन्म देती है "hasattr" eggs नहीं है।

इसके अलावा, hasattr का उपयोग केवल तभी करें जब आप मूल्य की आवश्यकता नहीं है; यदि आपको मूल्य की आवश्यकता है, तो getattr का उपयोग 2 तर्कों के साथ करें और अपवाद को पकड़ें, या 3 तर्क, तीसरा एक समझदार डिफ़ॉल्ट मान है।

getattr (का उपयोग कर परिणाम) (2.7.9):

>>> spam = Spam() 
>>> print(getattr(Spam, 'eggs')) 
<property object at 0x01E2A570> 
>>> print(getattr(spam, 'eggs')) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 7, in eggs 
AttributeError: No eggs without sausages 
>>> spam.sausages = True 
>>> print(getattr(spam, 'eggs')) 
42 
>>> print(getattr(spam, 'invalid')) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 10, in invalid 
AttributeError: 'Spam' object has no attribute 'foobar' 
>>> 
1

लगता है कि hasattr अपवाद (कम से कम in Python 2.7) निगलने के साथ एक समस्या है, तो शायद यह से दूर रहने की जब तक यह निश्चित है बेहतर है ।

लें, उदाहरण के लिए, the following code: