"সাবস্ক্রিপটেবল" ডোমেনের মধ্যে কোন ধরণের অবজেক্ট পড়ে?
"সাবস্ক্রিপটেবল" ডোমেনের মধ্যে কোন ধরণের অবজেক্ট পড়ে?
উত্তর:
এটির মূলত অর্থ হল যে বস্তুটি __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__
বিশেষ পদ্ধতিটি কার্যকর করে (তালিকাগুলি, অভিধানগুলি মনে করে)।
কম্পিউটিংয়ের সাবস্ক্রিপ্টের অর্থ: "অ্যারে এর উপাদানগুলির মধ্যে একটি নির্দিষ্ট করতে একটি প্রোগ্রাম বা একা বা অন্যদের সাথে একটি চিহ্ন হিসাবে (সাধারণত সাবস্ক্রিপ্ট হিসাবে লেখা হয় তবে অনুশীলনে সাধারণত হয় না)।"
এখন, @ ব্যবহারকারী2194711 দ্বারা প্রদত্ত সরল উদাহরণে আমরা দেখতে পাচ্ছি যে দুটি কারণের কারণে সংযোজনকারী উপাদান তালিকার অংশ হতে সক্ষম নয়: -
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"]
প্রকারের ত্রুটি: 'বিল্টিন_ফাংশন_আর_মোথার' অবজেক্টটি সাবস্ক্রিপ্টযোগ্য নয়
আমার এই একই সমস্যা ছিল। আমি করছিলাম
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
এটি ব্যবহারের চেষ্টা করার আগে সত্যই কার্যকর checking
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__')
কোনও জিনিস সাবস্ক্রিপ্টযোগ্য কিনা তা নির্ধারণ করতে?