आपके पास कुछ विकल्प हैं। सबसे पहले, ध्यान दें कि आपके उदाहरण में जी वास्तव में फ़ंक्शन के लिए स्थानीय नहीं है (यानी इसके भीतर असाइन नहीं किया गया है), यह एक वैश्विक है (यानी स्थानीय चर को असाइन नहीं किया गया है)। इसका मतलब यह है कि इसे मॉड्यूल में देखा जाएगा जिसमें फ़ंक्शन परिभाषित किया गया है। यह भाग्यशाली है, क्योंकि बाहरी रूप से स्थानीय लोगों को बदलने का कोई तरीका नहीं है (बाइटकोड पैच करने से छोटा), क्योंकि जब फ़ंक्शन चलता है, पहले नहीं होता है।
एक विकल्प फ़ंक्शन के मॉड्यूल के नामस्थान में आपके फ़ंक्शन को इंजेक्ट करने के लिए है। यह काम करेगा, लेकिन उस मॉड्यूल में प्रत्येक फ़ंक्शन को प्रभावित करेगा जो केवल एक फ़ंक्शन के बजाय चर का उपयोग करता है।
केवल एक समारोह को प्रभावित करने के लिए, आपको कहीं और func_globals को इंगित करने की आवश्यकता है। दुर्भाग्य से, यह केवल पढ़ने के लिए संपत्ति है, लेकिन आप एक ही शरीर के साथ समारोह पुनः द्वारा आप क्या चाहते हैं कर सकते हैं, लेकिन एक अलग वैश्विक नामस्थान:
import new
f = new.function(f.func_code, {'g': my_g_function}, f.func_name, f.func_defaults, f.func_closure)
च अब सिवाय इसके कि यह दिखाई देगा, indentical हो जाएगा प्रदान किए गए निर्देश में ग्लोबल्स के लिए। ध्यान दें कि यह पूरे वैश्विक नामस्थान को पुनर्निर्मित करता है - यदि वहां चर हैं तो f देखता है, सुनिश्चित करें कि आप उन्हें भी प्रदान करते हैं। हालांकि यह भी काफी हैकी है, और शायद cpython के अलावा अजगर के संस्करणों पर काम नहीं कर सकता है।
अपने अंतिम यह अजीब तकनीक का उपयोग कर लक्ष्य क्या है काम करने के लिए लगता है? आप एफ() से पहले जी() को परिभाषित क्यों नहीं कर सकते? –
मैंने पहले रनटाइम पर एक फ़ंक्शन के नामस्थान के साथ गड़बड़ करने की कोशिश की है (परीक्षण/मॉकिंग के लिए) और असफल ... बस FYI। –
क्या बिल्ली 'add_to_locals' है? यह मेरे लिए अस्तित्व में प्रतीत नहीं होता है। 'विशेषता त्रुटि:' फ़ंक्शन 'ऑब्जेक्ट में कोई विशेषता नहीं है' add_to_locals'' –