خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه رفع خطای «TypeError: object is not subscriptable» در پایتون

درک سیستم نوع پایتون برای حل این باگ مشکل کلیدی است.

آیا می خواهید داده ها را از یک شی بازیابی کنید و به جای آن خطای “ابجکت قابل ثبت نیست” را مشاهده می کنید؟ مشکل این است که شما نوع داده اشتباهی را فهرست بندی می کنید.

همه چیز را در مورد انواع قابل اشتراک و نحوه رفع این خطا بیابید.

“Subscriptable” در پایتون به چه معناست؟

اصطلاح “قابل اشتراک” در پایتون به معنای نوع داده ای است که چندین مقدار را ذخیره می کند که می توانید به صورت جداگانه به آنها دسترسی داشته باشید. می‌توانید از طریق شاخص آن، با استفاده از علامت‌گذاری براکت ([]) به یک مقدار خاص از یک نوع داده قابل اشتراک دسترسی داشته باشید.

اگر سعی می‌کنید به مواردی در نوع داده‌ای دسترسی پیدا کنید که ایندکس‌پذیر نیست، پایتون استثنایی «TypeError: object is not subscriptable» را ایجاد می‌کند.

انواع داده های زیر در پایتون قابل اشتراک هستند: لیست ها، رشته ها، تاپل ها و دیکشنری ها.

list_example = [1, 3, 5, "Idowu"]
string_example = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dict_example = {"name": "Idowu", "Language": "Yoruba"}

print(list_example[0]) # 1
print(string_example[3]) # w
print(tuple_example[1]) # 3
print(dict_example["name"]) # Idowu

با این حال، مجموعه ها، اعداد صحیح، شناورها و بولی ها از طریق نمایه سازی غیرقابل دسترسی هستند، بنابراین قابل اشتراک نیستند:

float_example = 12.45
int_example = 12367
bool_example = True
set_example = {1, 3, 5, "Python"}

print(float_example[1])
print(bool_example[2])
print(int_example[2])
print(set_example[2])

تلاش برای اجرای هر یک از این دستورات، استثنای “ابجکت قابل ثبت نیست” را به دست می‌دهد:

خروجی خط فرمان خطاهای مکرر «شیء قابل ثبت نیست» را نشان می دهد

حل استثناء

هنگامی که قوانین دسترسی به هر نوع داده را درک کنید، حل استثنای “شیء قابل ثبت نیست” آسان تر است. بنابراین اشکال زدایی پایتون را با بررسی نوع داده شی ای که می خواهید ایندکس کنید شروع کنید.

float_example = 12.45
int_example = 12367
bool_example = True
set_example = {1, 3, 5, "Python"}

print(type(float_example)) # <class 'float'>
print(type(int_example)) # <class 'int'>
print(type(bool_example)) # <class 'bool'>
print(type(set_example)) # <class 'set'>

هنگامی که تشخیص دادید که نوع داده قابل اشتراک نیست، تبدیل آن به نوع قابل نمایه سازی مشکل را حل می کند. اگر داده ها از یک API شخص ثالث باشد، این کار مفید است. تبدیل انواع داده‌ها مانند عدد صحیح، شناور و بولی به یک رشته، آنها را قابل اشتراک‌گذاری می‌کند:

print(str(float_example)[:2]) # 12
print(str(int_example)[:2]) # 12
print(str(bool_example)[:2]) # Tr

حتی می‌توانید رشته‌های پایتون به‌دست‌آمده را همانطور که می‌خواهید دستکاری کنید. اگر با عدد صحیح و شناور سروکار دارید، ممکن است بخواهید نوع داده اصلی را در خروجی حفظ کنید. برای انجام این کار، پس از ایندکس کردن آنها به عنوان رشته، مقدار حاصل را به نوع داده اصلی خود تبدیل کنید:

converted_float = float(str(float_example)[:2])
converted_int = int(str(int_example)[:2])

# 12.0 Data type:<class 'float'>
print(converted_float, f'Data type:{type(converted_float)}')

# 12 Data type:<class 'int'>
print(converted_int, f'Data type:{type(converted_int)}')

در مورد یک مجموعه، می توانید آن را به یک لیست تبدیل کنید. اگرچه شما می توانید یک شی مجموعه را با استفاده از لیست(مجموعه) تک خطی پایتون به لیست تبدیل کنید، اما این موقعیت آیتم ها را در لیست حاصل حفظ نمی کند. برای اطمینان از دریافت لیستی با موقعیت های آیتم های حفظ شده، از تابع لامبدا پایتون مانند زیر استفاده کنید:

set_example = {1, 3, 5, "Python"}
converted = sorted(set_example, key=lambda x: (isinstance(x, str), x))

print(converted[3]) # Python

استاد اشکال زدایی پایتون

پایتون منحنی یادگیری صافی دارد. اما اگر ندانید که چگونه با آنها مقابله کنید، استثناهای ساده می توانند شما را ناامید کنند. یادگیری اشکال زدایی کد خود و صرف زمان برای حل مسئله، راه زیادی برای رفع خطاها و استثنائات کدنویسی پایتون دارد.

مطلب مرتبط:   6 روش برای رفع خطای «دستگاه شما رفع‌های امنیتی و کیفیت مهمی ندارد»