2009-11-26 20 views
113

क्यों इस तरह संरचनाNameError: नाम 'स्वयं'

class A: 
    def __init__(self, a): 
     self.a = a 

    def p(self, b=self.a): 
     print b 

एक त्रुटि NameError: name 'self' is not defined देता परिभाषित नहीं है?

उत्तर

116

फ़ंक्शन डिफाईन-टाइम पर डिफ़ॉल्ट तर्क मान का मूल्यांकन किया जाता है, लेकिन self फ़ंक्शन कॉल समय पर केवल एक तर्क उपलब्ध है। इस प्रकार तर्क सूची में तर्क एक-दूसरे को संदर्भित नहीं कर सकते हैं।

यह एक आम पैटर्न None लिए एक तर्क डिफ़ॉल्ट और कोड में है कि के लिए एक परीक्षण को जोड़ने के लिए है:

def p(self, b=None): 
    if b is None: 
     b = self.a 
    print b 
+0

हालांकि मुझे लगता है कि उपर्युक्त बहुत सुंदर नहीं है (मैं रूबी से आती हूं जहां चीजें ठीक काम करती हैं), उपर्युक्त वास्तव में एक कामकाज के रूप में काम करता है। यह अभी भी अजीब है कि पायथन ने पैरामीटर सूची में स्वयं अनुपलब्ध होना चुना है। – shevy

14

मामलों में जहां आप भी कोई नहीं करने के लिए 'बी' करने का विकल्प है करना चाहते हैं के लिए:

def p(self, **kwargs): 
    b = kwargs.get('b', self.a) 
    print b 
+1

यह सुनिश्चित नहीं है कि इसके बारे में अत्यधिक जटिल क्या है। अपने स्वयं के समाधान के साथ झुकाव के लिए स्वतंत्र महसूस करें जो बी के सभी मूल्यों को संरक्षित करता है। – Andrew

1

यदि आप यहां Google के माध्यम से पहुंचे हैं, तो कृपया यह सुनिश्चित करना सुनिश्चित करें कि आपने स्वयं को वर्ग फ़ंक्शन के लिए पहला पैरामीटर दिया है। विशेष रूप से यदि आप फ़ंक्शन के अंदर उस ऑब्जेक्ट के मानों को संदर्भित करने का प्रयास करते हैं।

def foo(): 
    print(self.bar) 

> NameError: नाम 'स्वयं' परिभाषित नहीं है

def foo(self): 
    print(self.bar) 

> "बधाई हो आपको NameError से छुटकारा मिला!"