जवाबों:
इसका मूल रूप से मतलब यह है कि ऑब्जेक्ट __getitem__()
विधि को लागू करता है। दूसरे शब्दों में, यह उन वस्तुओं का वर्णन करता है जो "कंटेनर" हैं, जिसका अर्थ है कि उनमें अन्य वस्तुएं हैं। इसमें तार, सूचियाँ, टुपल्स और शब्दकोश शामिल हैं।
[
... ]
का अनुक्रमण वाक्य रचना एक कहा जाता है सबस्क्रिप्ट , क्योंकि यह गणितीय संकेतन के बराबर है कि का उपयोग करता है वास्तविक सबस्क्रिप्ट; उदाहरण के a[1]
लिए अजगर क्या गणितज्ञों a₁ के रूप में लिखेंगे । तो "सब्स्क्रिप्टेबल" का अर्थ है "सबस्क्रिप्ट होने में सक्षम"। जो, पायथन शब्दों में, इसका मतलब है कि इसे लागू करना है __getitem__()
, क्योंकि a[1]
सिर्फ चीनी के लिए सिंटैक्टिक है a.__getitem__(1)
।
hasattr
ठीक काम करना चाहिए, लेकिन यह चीजों को करने का पैथोनिक तरीका नहीं है; अजगर अभ्यास डक टंकण को प्रोत्साहित करता है । मतलब, यदि आप एक सबस्क्रिप्ट का उपयोग करके अपनी वस्तु से कोई वस्तु लाने की कोशिश कर रहे हैं, तो आगे बढ़ें और इसे करें; यदि आपको लगता है कि यह काम नहीं कर सकता क्योंकि ऑब्जेक्ट सबस्क्रिप्टेबल नहीं है, तो इसे try
ब्लॉक के साथ ब्लॉक में लपेटें except TypeError
।
मेरे सिर के ऊपर, निम्नलिखित केवल अंतर्निहित इन्स हैं जो सबस्क्रिप्टेबल हैं:
string: "foobar"[3] == "b"
tuple: (1,2,3,4)[3] == 4
list: [1,2,3,4][3] == 4
dict: {"a":1, "b":2, "c":3}["c"] == 3
लेकिन मिपाडी का जवाब सही है - कोई भी वर्ग जो लागू __getitem__
होता है, सबस्क्रिप्टेबल है
एक स्क्रिप्ट योग्य वस्तु एक ऐसी वस्तु है जो उसके किए गए कार्यों को रिकॉर्ड करती है और यह उन्हें "स्क्रिप्ट" के रूप में संग्रहीत कर सकती है जिसे फिर से देखा जा सकता है।
उदाहरण के लिए, देखें: एप्लिकेशन स्क्रिप्टिंग फ़्रेमवर्क
अब, अगर एलिस्टेयर को यह नहीं पता था कि उन्होंने क्या पूछा और वास्तव में "सबस्क्रिप्टेबल" वस्तुओं का मतलब था (जैसा कि दूसरों द्वारा संपादित किया गया है), तो (जैसा कि मिपाडी ने भी उत्तर दिया) यह सही है:
एक सबस्क्रिप्टेबल ऑब्जेक्ट कोई भी ऑब्जेक्ट है जो __getitem__
विशेष विधि (विचार सूचियों, शब्दकोशों) को लागू करता है।
कंप्यूटिंग में सबस्क्रिप्ट का अर्थ है: "एक प्रतीक (विशेष रूप से एक सबस्क्रिप्ट के रूप में लिखा जाता है, लेकिन व्यवहार में आमतौर पर ऐसा नहीं होता है) एक प्रोग्राम में, अकेले या दूसरों के साथ, एक एरे के तत्वों को निर्दिष्ट करने के लिए उपयोग किया जाता है।"
अब, @ user2194711 द्वारा दिए गए सरल उदाहरण में हम देख सकते हैं कि दो कारणों से सूची तत्व शामिल नहीं हो पा रहा है: -
1) हम वास्तव में विधि के परिशिष्ट को नहीं बुला रहे हैं; क्योंकि इसे ()
कॉल करने की आवश्यकता है।
2) त्रुटि यह संकेत दे रही है कि फ़ंक्शन या विधि सबस्क्रिप्टेबल नहीं है; इसका मतलब है कि वे सूची या अनुक्रम की तरह अनुक्रमित नहीं हैं।
अब इसे देखें: -
>>> var = "myString"
>>> def foo(): return 0
...
>>> var[3]
't'
>>> foo[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable
इसका मतलब यह है कि इसमें कोई सदस्यता या तत्व नहीं हैं function
जैसे कि वे अनुक्रम में होते हैं; और हम उन तक पहुंच नहीं सकते हैं जैसे हम करते हैं, जिसकी मदद से []
।
इसके अलावा, जैसा कि मिपाडी ने अपने जवाब में कहा; इसका मूल रूप से मतलब यह है कि ऑब्जेक्ट __getitem__()
विधि को लागू करता है। (यदि यह सबस्क्रिप्टेबल है)। इस प्रकार त्रुटि उत्पन्न हुई:
arr.append["HI"]
TypeError: 'buildin_function_or_method' ऑब्जेक्ट सबस्क्रिप्टेबल नहीं है
मेरा भी यही मुद्दा था। मैं कर रहा था
arr = []
arr.append["HI"]
इसलिए उपयोग [
करने में त्रुटि हो रही थी। यह होना चाहिएarr.append("HI")
पहले के उत्तर के लिए एक कोरोलरी के रूप में यहाँ, बहुत बार यह एक संकेत है कि आपको लगता है कि आपके पास एक सूची (या तानाशाही, या अन्य सबस्क्रिप्टेबल ऑब्जेक्ट) है जब आप नहीं करते हैं।
उदाहरण के लिए, मान लें कि आपके पास एक फ़ंक्शन है जिसे एक सूची वापस करनी चाहिए ;
def gimme_things():
if something_happens():
return ['all', 'the', 'things']
अब जब आप उस फ़ंक्शन को कॉल करते हैं, और something_happens()
किसी कारण से True
मान वापस नहीं होता है, तो क्या होता है? if
विफल रहता है, और इसलिए आप के माध्यम से गिर; gimme_things
स्पष्ट रूप से return
कुछ भी नहीं है - तो वास्तव में, यह स्पष्ट रूप से होगा return None
। फिर यह कोड:
things = gimme_things()
print("My first thing is {0}".format(things[0]))
" NoneType
ऑब्जेक्ट सबस्क्रिप्टेबल नहीं है " के साथ विफल हो जाएगा क्योंकि, ठीक है, things
है None
और इसलिए आप ऐसा करने की कोशिश कर रहे हैं None[0]
जो समझ में नहीं आता क्योंकि ... त्रुटि संदेश क्या कहता है।
आपके कोड में इस बग को ठीक करने के दो तरीके हैं - पहला यह कि things
यह प्रयोग करने का प्रयास करने से पहले वास्तव में मान्य है की जाँच करके त्रुटि से बचने के लिए ;
things = gimme_things()
if things:
print("My first thing is {0}".format(things[0]))
else:
print("No things") # or raise an error, or do nothing, or ...
या अनिवार्य रूप से TypeError
अपवाद का जाल ;
things = gimme_things()
try:
print("My first thing is {0}".format(things[0]))
except TypeError:
print("No things") # or raise an error, or do nothing, or ...
एक और नया स्वरूप है gimme_things
ताकि आप सुनिश्चित करें कि यह हमेशा एक सूची देता है। इस मामले में, यह संभवत: सरल डिजाइन है क्योंकि इसका मतलब है कि अगर कई जगह हैं जहां आपके पास समान बग है, तो उन्हें सरल और मुहावरेदार रखा जा सकता है।
def gimme_things():
if something_happens():
return ['all', 'the', 'things']
else: # make sure we always return a list, no matter what!
logging.info("Something didn't happen; return empty list")
return []
बेशक, आप क्या डालते हैं else:
शाखा आपके उपयोग के मामले पर निर्भर करता है। शायद आपको something_happens()
असफल होने पर एक अपवाद उठाना चाहिए , इसे और अधिक स्पष्ट और स्पष्ट करने के लिए जहां वास्तव में कुछ गलत हुआ था? अपने स्वयं के कोड में अपवाद जोड़ना अपने आप को यह बताने का एक महत्वपूर्ण तरीका है कि जब कुछ विफल हो जाता है तो वास्तव में क्या है!
(सूचना भी कैसे इस बाद ठीक अभी भी यह नहीं है कि पूरी तरह से बग को ठीक - यह आप सबस्क्रिप्ट करने का प्रयास करने से रोकता है None
, लेकिन things[0]
अभी भी एक है IndexError
जब things
एक खाली सूची है कि आप एक है। try
आप कर सकते हैं except (TypeError, IndexError)
भी, यह जाल करने के लिए।)
hasattr(SomeClassWithoutGetItem, '__getitem__')
यह निर्धारित करने के लिए कि क्या कोई चीज़ ग्राह्य है?