خطای builtin_function_or_method object is not subscriptable در پایتون
یکی از خطاهای رایجی که در پایتون با آن مواجه میشویم خطای builtin_function_or_method object is not subscriptable است. این خطا زمانی در پایتون ایجاد میشود که بعد از یک تابع یا یک متد از براکت [] استفاده شود. توابع و متدهای پایتون قابل فراخوانی هستند و برای اجرای آنها باید از پرانتز استفاده شود.
به مثال زیر دقت کنید:
numbers = [2, 4, 6, 8]
numbers.append[10]
اگر کد بالا را اجرا کنید با خطای زیر مواجه خواهید شد:
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
برای اجرای تابع append باید از پرانتز استفاده شود اما از آنجایی که ما از براکت استفاده کردیم، پایتون به ما خطای subscriptable نمایش داد. این خطا برای توابع و متدهای داخلی پایتون نمایش داده میشود.
ویدیو پیشنهادی: تابع در پایتون
# خطای TypeError function object is not subscriptable پایتون
اگر تابع یا متدی داشته باشید که توسط کاربر ایجاد شده باشد و با براکت فراخوانی شود، پایتون خطای مشابه دیگری را نمایش میدهد. به مثال زیر دقت کنید:
def greet_person(name):
print(f"Hello {person}")
greet_person["James"]
اگر کد بالا را اجرا کنیم با خطای زیر مواجه میشویم:
Traceback (most recent call last):
...
TypeError: 'function' object is not subscriptable
از آنجایی که تابع greet_person یکی از توابع داخلی پایتون نیست، پس پایتون از عنوان function به جای builtin_function_or_method استفاده میکند.
بخش دوم خطا پیغام subscriptable را نمایش میدهد. آیجکت های پایتون subscriptable هستند اگر بتوان با استفاده از براکت به آیتم های آنها دسترسی پیدا کرد. مثلا لیست پایتون یک آبجکت subscriptable است زیرا میتوان با براکت به المان های آن دسترسی پیدا کرد. به مثال زیر دقت کنید:
>>> numbers = [44, 33, 55, 66, 77]
>>> numbers[1:3]
[33, 55]
همچنین رشته ها، دیکشنری ها و تاپل های پایتون نیز subscriptable هستند.
# تفاوت subscriptable و callable در پایتون
آبجکت هایی در پایتون وجود دارند که داخل کلاس خود متد __getitem__ را پیاده سازی کرده اند. در زمان کار با این آبجکت ها میتوانید با استفاده از براکت به آیتم های آنها دسترسی پیدا کنید. این آبجکت ها subscriptable نام دارند. مثلا لیست ها، دیکشنری ها، تاپل ها و رشته های پایتون همگی subscriptable هستند. به مثال زیر دقت کنید:
>>> name = "mongard"
>>> name[0]
m
نوع دیگری از آبجکت ها در پایتون هستند که اگر بعد از نام آنها از پرانتز استفاده کنید، بدنه آنها اجرا خواهد شد. این آبجکت های پایتون callable نام دارند. فانکشن ها و متدهای پایتون همگی callable هستند. همچنین کلاس های پایتون نیز callable هستند به شرطی که تابع __call__ را داخل بدنه خود پیاده سازی کرده باشند. در واقع هر آبجکتی که در کلاس خود متد __call__ را داشته باشد، قابل فراخوانی یا قابل صدا زدن یا callable نام میگیرد.
اگر کلاسی را که تابع __call__ را نداشته باشد با پرانتز فراخوانی کنید، پایتون خطای زیر را میدهد:
>>> numbers = [2, 4, 6, 8]
>>> numbers(0)
Traceback (most recent call last):
...
TypeError: 'list' object is not callable
متغیر numbers یک لیست است و قابل صدا زدن نیست. برای دسترسی به آیتم های آن باید از براکت استفاده کنید.
ویدیو پیشنهادی: ویدیو آموزش متدهای getitem, setitem, delitem در پایتون
# حل خطای not subscriptable پایتون
برای حل این خطا میتوانید از تابع callable استفاده کنید. این تابع به شما نشان میدهد که آیا میتوان آبجکتی را صدا زد یا خیر. به مثال زیر دقت کنید:
>>> callable(numbers.append)
True
همچنین میتوانید از تابع type استفاده کنید و نوع آبجکت را تشخیص دهید:
>>> type(print)
<class 'builtin_function_or_method'>
خروجی بالا نشان میدهد که print یک تابع یا متد است که قابل فراخوانی است.