अगर पायथन ऑब्जेक्ट "सब्स्क्रिप्टेबल" है या नहीं तो इसका क्या मतलब है?


जवाबों:


356

इसका मूल रूप से मतलब यह है कि ऑब्जेक्ट __getitem__()विधि को लागू करता है। दूसरे शब्दों में, यह उन वस्तुओं का वर्णन करता है जो "कंटेनर" हैं, जिसका अर्थ है कि उनमें अन्य वस्तुएं हैं। इसमें तार, सूचियाँ, टुपल्स और शब्दकोश शामिल हैं।


2
कितना विश्वसनीय होगा: hasattr(SomeClassWithoutGetItem, '__getitem__')यह निर्धारित करने के लिए कि क्या कोई चीज़ ग्राह्य है?
jmunsch

2
[... ]का अनुक्रमण वाक्य रचना एक कहा जाता है सबस्क्रिप्ट , क्योंकि यह गणितीय संकेतन के बराबर है कि का उपयोग करता है वास्तविक सबस्क्रिप्ट; उदाहरण के a[1]लिए अजगर क्या गणितज्ञों a₁ के रूप में लिखेंगे । तो "सब्स्क्रिप्टेबल" का अर्थ है "सबस्क्रिप्ट होने में सक्षम"। जो, पायथन शब्दों में, इसका मतलब है कि इसे लागू करना है __getitem__(), क्योंकि a[1]सिर्फ चीनी के लिए सिंटैक्टिक है a.__getitem__(1)
मार्क रीड

उस कॉल को hasattrठीक काम करना चाहिए, लेकिन यह चीजों को करने का पैथोनिक तरीका नहीं है; अजगर अभ्यास डक टंकण को प्रोत्साहित करता है । मतलब, यदि आप एक सबस्क्रिप्ट का उपयोग करके अपनी वस्तु से कोई वस्तु लाने की कोशिश कर रहे हैं, तो आगे बढ़ें और इसे करें; यदि आपको लगता है कि यह काम नहीं कर सकता क्योंकि ऑब्जेक्ट सबस्क्रिप्टेबल नहीं है, तो इसे tryब्लॉक के साथ ब्लॉक में लपेटें except TypeError
मार्क रीड

77

मेरे सिर के ऊपर, निम्नलिखित केवल अंतर्निहित इन्स हैं जो सबस्क्रिप्टेबल हैं:

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__होता है, सबस्क्रिप्टेबल है


17

एक स्क्रिप्ट योग्य वस्तु एक ऐसी वस्तु है जो उसके किए गए कार्यों को रिकॉर्ड करती है और यह उन्हें "स्क्रिप्ट" के रूप में संग्रहीत कर सकती है जिसे फिर से देखा जा सकता है।

उदाहरण के लिए, देखें: एप्लिकेशन स्क्रिप्टिंग फ़्रेमवर्क

अब, अगर एलिस्टेयर को यह नहीं पता था कि उन्होंने क्या पूछा और वास्तव में "सबस्क्रिप्टेबल" वस्तुओं का मतलब था (जैसा कि दूसरों द्वारा संपादित किया गया है), तो (जैसा कि मिपाडी ने भी उत्तर दिया) यह सही है:

एक सबस्क्रिप्टेबल ऑब्जेक्ट कोई भी ऑब्जेक्ट है जो __getitem__विशेष विधि (विचार सूचियों, शब्दकोशों) को लागू करता है।


2
ध्यान दें कि मैं "स्क्रिप्ट योग्य" वस्तुओं के बारे में मूल प्रश्न का उत्तर दे रहा हूं, न कि "सबस्क्रिप्टेबल" जैसा कि दूसरों द्वारा संपादित किया गया है, एलिस्टेयर नहीं। मैं वास्तव में टिप्पणी करना चाहूंगा।
tzot

आह, मेरे संग्रह के लिए एक नया बिल्ला! :) बस मजाक कर रहे हैं, जाहिर है। सवाल के संपादन को सही ठहराने वाली बात यह थी कि एलिस्टेयर ने एक जवाब चुना था; मुझे अभी भी यकीन नहीं है कि एलिस्टेयर चुनने के बारे में निश्चित था।
tzot

16

कंप्यूटिंग में सबस्क्रिप्ट का अर्थ है: "एक प्रतीक (विशेष रूप से एक सबस्क्रिप्ट के रूप में लिखा जाता है, लेकिन व्यवहार में आमतौर पर ऐसा नहीं होता है) एक प्रोग्राम में, अकेले या दूसरों के साथ, एक एरे के तत्वों को निर्दिष्ट करने के लिए उपयोग किया जाता है।"

अब, @ 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' ऑब्जेक्ट सबस्क्रिप्टेबल नहीं है


7

मेरा भी यही मुद्दा था। मैं कर रहा था

arr = []
arr.append["HI"]

इसलिए उपयोग [करने में त्रुटि हो रही थी। यह होना चाहिएarr.append("HI")


3

पहले के उत्तर के लिए एक कोरोलरी के रूप में यहाँ, बहुत बार यह एक संकेत है कि आपको लगता है कि आपके पास एक सूची (या तानाशाही, या अन्य सबस्क्रिप्टेबल ऑब्जेक्ट) है जब आप नहीं करते हैं।

उदाहरण के लिए, मान लें कि आपके पास एक फ़ंक्शन है जिसे एक सूची वापस करनी चाहिए ;

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)भी, यह जाल करने के लिए।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.