मैं एक समारोह है कि तर्क के रूप में एक और समारोह या विधि लेता में argspec उपयोग कर रहा हूँ में कोई नहीं की तरह कस्टम प्लेसहोल्डर, और रिटर्न इस तरह एक टपल:अजगर
(("arg1", obj1), ("arg2", obj2), ...)
इसका मतलब है कि पारित कर दिया करने के लिए पहला तर्क फ़ंक्शन arg1 है और इसका obj1 का डिफ़ॉल्ट मान है, और इसी तरह।
यहां रगड़ है: यदि इसका कोई डिफ़ॉल्ट मान नहीं है, तो मुझे इसे इंगित करने के लिए प्लेसहोल्डर मान की आवश्यकता है। मैं किसी का उपयोग नहीं कर सकता, क्योंकि तब मैं के बीच अंतर नहीं कर सकता कोई डिफ़ॉल्ट मान और डिफ़ॉल्ट मान कोई नहीं है। झूठी, 0, -1, आदि के लिए वही। मैं इसे एक तत्व के साथ एक टुपल बना सकता हूं, लेकिन फिर इसे जांचने के लिए कोड बदसूरत होगा, और मैं इसे आसानी से एक ताना में बदल नहीं सकता। तो मैंने सोचा कि मैं एक कोई नहीं की तरह उद्देश्य यह है कि कोई भी नहीं है बनाते हैं, और यह है कि मैं क्या लेकर आए हैं:
class MetaNoDefault(type):
def __repr__(cls):
return cls.__name__
__str__ = __repr__
class NoDefault(object):
__metaclass__ = MetaNoDefault
अब ("arg1", NoDefault)
इंगित करता है ARG1 कोई डिफ़ॉल्ट मान है, और मैं कर सकते हैं if obj1 is NoDefault:
आदि जैसे मेटाक्लास इसे <class '__main__.NoDefault'>
के बजाय NoDefault
के रूप में प्रिंट करता है।
क्या ऐसा कोई कारण नहीं है? क्या कोई बेहतर समाधान है?
क्या कोई कारण है कि आप किसी भी डिफ़ॉल्ट के लिए केवल एक तत्व के tuple नहीं हो सकता है? कुछ ऐसा: '((" arg1 ",), (" arg2 ", obj2), ...) 'जहां" arg1 "में कोई डिफ़ॉल्ट नहीं है। आप तब कर सकते हैं यदि 'len (the_tuple) == 1' आदि – Fenikso
@FMc: डिफ़ॉल्ट तर्कों के आकस्मिक संशोधन से आने वाली गलतियों से बचने के लिए, म्यूटेबल डिफ़ॉल्ट का कभी भी उपयोग करना बेहतर नहीं है। – lunaryorn
@ फेनिक्सो मैंने अपने प्रश्न में इस संभावना को शामिल किया है। संक्षेप में, मुझे यह सुरुचिपूर्ण लगता है, भले ही यह _is_ सहज ज्ञान युक्त है। –