2017-09-11 8 views
8

कीवर्ड तारस्वीकारना पूर्णांकों

>>> def foo(**kwargs): 
...  pass 
... 
>>> foo(**{0:0}) 
TypeError: foo() keywords must be strings 

लेकिन कुछ काला जादू से हो have to, नामस्थान बायपास करने में सक्षम हैं कि

>>> from types import SimpleNamespace 
>>> SimpleNamespace(**{0:0}) 
namespace() 

क्यों? और कैसे? क्या आप एक पायथन फ़ंक्शन को कार्यान्वित कर सकते हैं जो kwargs मैपिंग में पूर्णांक प्राप्त कर सकता है?

+1

अधिक महत्वपूर्ण सवाल: आपको इसकी आवश्यकता क्यों होगी? –

+2

तो, संक्षेप में: आप एक सी-एक्सटेंशन प्रकार को परिभाषित कर सकते हैं जो कीवर्ड तर्क स्वीकार करता है और वे प्रतिबंधित नहीं हैं। लेकिन आप एक पायथन समारोह को परिभाषित नहीं कर सकते जो वही करता है। –

+2

आश्चर्य है कि कोई अन्य अजगर वितरण एक ही व्यवहार प्रदर्शित करता है ... –

उत्तर

6

क्या आप एक पायथन फ़ंक्शन को कार्यान्वित कर सकते हैं जो kwargs मैपिंग में पूर्णांक प्राप्त कर सकता है?

नहीं, आप नहीं कर सकते। पाइथन मूल्यांकन लूप पाइथन कोड में परिभाषित कॉलिंग फ़ंक्शंस को कोड कोड में परिभाषित कॉल करने योग्य ऑब्जेक्ट को कॉल करने से अलग करता है। पाइथन मूल्यांकन लूप कोड जो कीवर्ड तर्क विस्तार को संभालता है, ने गैर-स्ट्रिंग कीवर्ड तर्कों पर दरवाजा बंद कर दिया है।

लेकिन SimpleNamespace पायथन परिभाषित कॉल करने योग्य नहीं है, इसे entirely in C code परिभाषित किया गया है। यह बिना किसी सत्यापन के सीधे कीवर्ड तर्क स्वीकार करता है, यही कारण है कि आप गैर-स्ट्रिंग कीवर्ड तर्क वाले शब्दकोश में पास कर सकते हैं।

शायद यह एक बग है; आपको C-API argument parsing functions का उपयोग करना चाहिए, जो सभी गैर-स्ट्रिंग कीवर्ड तर्कों के विरुद्ध सुरक्षा करते हैं। लेकिन SimpleNamespace केवल sys.implementation data* ऑब्जेक्ट होने के लिए डिज़ाइन किया गया था, और वास्तव में अन्य उपयोगों के लिए डिज़ाइन नहीं किया गया था।

ऐसे अन्य अपवाद हो सकते हैं, लेकिन वे सभी सी-परिभाषित कॉलबेल होंगे, पायथन फ़ंक्शन नहीं।


*time.get_clock_info() method भी SimpleNamespace वर्ग का एक उदाहरण चलाता है; यह एकमात्र अन्य स्थान है जिस प्रकार वर्तमान में उपयोग किया जाता है।

संबंधित मुद्दे