अद्यतन:संकुचित इलाज के रूप में iterable
एक विचार निर्मित तार बनाने के लिए गैर iterable proposed on python.org in 2006 था। मेरा प्रश्न अलग-अलग है कि मैं थोड़ी देर में इस सुविधा को केवल दबाने की कोशिश कर रहा हूं; अभी भी यह पूरा धागा काफी प्रासंगिक है।
यहाँ महत्वपूर्ण comments by Guido जो एक परीक्षण के आधार पर क्रियान्वित गैर iterable str
हैं:
[...] मैं इस कार्यान्वित (यह वास्तव में लिए आसान था) लेकिन फिर पाया मैं ठीक करने के लिए किया था तारों से अधिक स्थानों को फिर से चालू करें। उदाहरण के लिए:
सेट की तरह
sre पार्सर और संकलक उपयोग बातें ("") और भी इनपुट regexp के पात्रों से अधिक पुनरावृति यह पार्स करने के लिए।
difflib एक API तार की या तो दो सूचियों के लिए परिभाषित किया गया (एक ठेठ पंक्ति-दर-पंक्ति एक फ़ाइल का अंतर), या दो तार (एक ठेठ इंट्रा-लाइन अंतर), या यहाँ तक कि कुछ भी की दो सूचियां (है एक सामान्यीकृत क्रम भिन्नता के लिए)।
optparse.py में छोटे बदलाव, textwrap.py, string.py।
और मैं भी बिंदु पर नहीं कर रहा हूँ जहाँ regrtest.py ढांचा भी काम करता है (difflib समस्या के कारण)।
मैं इस परियोजना को छोड़ रहा हूं; पैच एसएफ पैच 14712 9 1 है। मैं इस विचार के पक्ष में नहीं हूं; यह सिर्फ व्यावहारिक नहीं है, और आधार है कि एक स्ट्रिंग पर पुनरावृत्त करने के कुछ अच्छे कारण हैं दोनों sre और difflib में उपयोग किए गए उपयोग मामलों से अस्वीकार कर दिया गया है।
मूल प्रश्न:
हालांकि यह भाषा है कि एक स्ट्रिंग एक iterable है की एक साफ सुविधा है, जब बतख टाइपिंग के साथ संयुक्त, यह आपदा को जन्म दे सकती:
# record has to support [] operation to set/retrieve values
# fields has to be an iterable that contains the fields to be set
def set_fields(record, fields, value):
for f in fields:
record[f] = value
set_fields(weapon1, ('Name', 'ShortName'), 'Dagger')
set_fields(weapon2, ('Name',), 'Katana')
set_fields(weapon3, 'Name', 'Wand') # I was tired and forgot to put parentheses
कोई अपवाद नहीं उठाया जाएगा, और असंख्य स्थानों में isinstance(fields, str)
के परीक्षण के अलावा इसे पकड़ने का कोई आसान तरीका नहीं है। कुछ परिस्थितियों में, इस बग को खोजने में बहुत लंबा समय लगेगा।
मैं स्ट्रिंग को पूरी तरह से अपने प्रोजेक्ट में एक पुनरावर्तनीय के रूप में अक्षम करने से अक्षम करना चाहता हूं। क्या यह एक अच्छा विचार है? क्या यह आसानी से और सुरक्षित तरीके से किया जा सकता है?
शायद मैं str
में अंतर्निहित उपclass कर सकता हूं, जैसे कि मैं स्पष्ट रूप से get_iter()
पर कॉल करने की आवश्यकता होगी यदि मैं चाहता हूं कि इसकी वस्तु को एक पुनरावर्तनीय माना जाए। फिर जब भी मुझे स्ट्रिंग अक्षर की आवश्यकता होती है, तो मैं इसके बजाय इस वर्ग का ऑब्जेक्ट बनाउंगा।
यहाँ कुछ स्पर्शरेखीय संबंधित प्रश्न हैं:
How can I tell if a python variable is a string or a list?
how to tell a variable is iterable but not a string
मुझे लगता है कि आपने मूल रूप से अपने स्वयं के प्रश्न का उत्तर दिया है। यदि आपको ऐसा करना है तो आपके दो तरीके सबसे अच्छे तरीके हैं, लेकिन सबसे अच्छा जवाब यह सुनिश्चित करना है कि ऐसा नहीं होता है। –
मैं बस 'इंस्टेंसेंस (फ़ील्ड्स, स्ट्र)' चेक के साथ रहूंगा - आपको स्ट्रिंग की तरह क्वाक करने के लिए कभी भी अपने स्वयं के प्रकार बनाने की क्षमता की आवश्यकता नहीं है। वैकल्पिक रूप से, अंतिम, varargs तर्क 'फ़ील्ड' बनाओ। (यद्यपि यह थक गया है और भूल जाता है कि आप * * * को इसके चारों ओर कोष्ठक नहीं रखना चाहते हैं।) – millimoose
तारों की जेनेरिक सूचियों के रूप में स्ट्रिंग को परिभाषित करने वाली किसी भी लाइब्रेरी/भाषा में यह समस्या होगी। यह एक पायथन चीज की तरह प्रतीत नहीं होता है। – Apalala