मुझे नहीं पता कि यह getattrbuilt_in पद्धति का अपेक्षित व्यवहार है या नहीं। getattr डिफ़ॉल्ट (तीसरा) तर्क को भी निष्पादित करता है, भले ही वास्तविक तर्क (दूसरा) शर्त को संतुष्ट करता हो। उदाहरण:

def func():
    print('In Function')

class A:
    def __init__(self):
        self.param = 12

a = A()

जब मैं getattr(a, 'param', func()) चलाता हूं तो यह परिणाम देता है:

In Function
12

In Function पर ध्यान दें जो मुझे नहीं चाहिए।

लेकिन जब मैं getattr(a, 'param1', func()) यानी आउटपुट निष्पादित करता हूं तो यह पूरी तरह से ठीक काम करता है

In Function

लेकिन मैं केवल 12 के रूप में परिणाम चाहता हूं यदि शर्त पूरी हो। कृपया मुझे बताएं कि getattr का ऐसा व्यवहार क्यों है और क्या हम उन्हें ऐसा करने से रोक सकते हैं (यदि दूसरा तर्क है तो तीसरा तर्क निष्पादित नहीं करना है), अगर पाइथोनिक तरीके से इसे करने का वैकल्पिक तरीका साझा किया जाए तो इसकी सराहना की जाएगी। एक बात जो सबसे पहले दिमाग में आती है वह यह है कि param1 hasattr का उपयोग करके जांच लें और फिर आवश्यक कार्रवाई करें।

5
MaNKuR 26 जुलाई 2016, 15:23

1 उत्तर

सबसे बढ़िया उत्तर

getattr के निष्पादित होने से पहले, सभी पारित मापदंडों का मूल्यांकन किया जाना है। func() उन मापदंडों में से एक है और इसका मूल्यांकन करने का प्रयास print स्टेटमेंट को निष्पादित करेगा। विशेषता मिलेगी या नहीं, func() का मूल्यांकन पहले किया जाना चाहिए।

यह getattr के लिए विशिष्ट नहीं है, यह है कि पायथन में कार्य और उनके पैरामीटर कैसे काम करते हैं।


निम्न पर विचार करें:

>>> def does_nothing(any_arg): pass
...
>>> def f(): print("I'll get printed")
...
>>>
>>> does_nothing(f())
I'll get printed

फ़ंक्शन does_nothing वास्तव में पारित पैरामीटर के साथ कुछ नहीं करता है। लेकिन फ़ंक्शन कॉल के माध्यम से जाने से पहले पैरामीटर का मूल्यांकन किया जाना चाहिए।


हालांकि print कथन getattr के परिणाम को प्रभावित नहीं करेगा; एक तरह का दुष्प्रभाव। घटना में विशेषता नहीं मिली है return फ़ंक्शन के मान का उपयोग किया जाता है।

10
Aran-Fey 17 जून 2018, 15:01
मुझे लगता है कि यह अतिरिक्त फ़ंक्शन जोड़ने का एक ओवरहेड होगा और इसके बजाय मुझे लगता है कि मुझे hasattr चेक के साथ जाना चाहिए। फिर भी धन्यवाद।
 – 
MaNKuR
26 जुलाई 2016, 18:48
8
यदि आप नहीं चाहते कि func() का मूल्यांकन तब किया जाए जब a में attr param हो, तो आप इसमें बदल सकते हैं: getattr(a, 'param', None) or func()or के बाद कोई भी मान्य कोड आलसी हो जाता है।
 – 
Joey.Chang
27 जुलाई 2016, 09:35
धन्यवाद @ चांग। जियान, यह उपयोगी चाल है। मैं इसे कैसे मिस कर सकता हूं।
 – 
MaNKuR
27 जुलाई 2016, 15:22
यह पूरी तरह समकक्ष नहीं है। or के बाद का कोड भी चलेगा अगर or से पहले का मान गलत है, जैसे 0 या गलत
 – 
Stian Jensen
8 मई 2020, 18:08