Ana içeriğe geç

builtin_function_or_method' nesnesi subscriptable değil hatası nasıl düzeltilir

"'builtin_function_or_method' object is not subscriptable" hatasını düzeltmek için, fonksiyonu veya yöntemi köşeli parantezler [] yerine parantezlerle () çağırdığınızdan emin olun.
· 6 dk. oku

Yapay Zeka ile Keşfedin

Python'da yaygın bir hata mesajı şöyledir:

'builtin_function_or_method' object is not subscriptable

Python, bir fonksiyon veya yöntemin hemen ardından köşeli parantez [] gösterimi geldiğinde bu hatayı verir. Oysa fonksiyonlar çağrılabilir (callable) nesnelerdir. Bu nedenle parantez () gerektirirler; kimi zaman yuvarlak parantez de denir.

Python'ın bu hatayı verdiği bir örneğe bakalım:

numbers = [2, 4, 6, 8]
numbers.append[10]
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

Aşağıdaki bölüm bu hatayı daha ayrıntılı inceler.

Hatanın Anlaşılması

Python fonksiyonları çağrılabilir nesnelerdir; bu da fonksiyon adından sonra parantez kullanarak, fonksiyon tanımındaki kodu çalıştırabileceğimiz anlamına gelir. Python'daki yerleşik fonksiyonlara en bilinen örneklerden biri print()'tir:

print("This is a built-in function")
This is a built-in function

Python'da bir fonksiyonu çağırmak için parantez kullanılır. Ancak, parantez yerine köşeli parantez kullanmak hata üretir:

print["This is a built-in function"]
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

Hata mesajını temel parçalarına ayıralım:

  • Bir 'builtin_function_or_method' nesnesi
  • Subscriptable değil

Yukarıdaki örnekte, print() bir yerleşik fonksiyondur. Açıklama yöntemleri de kapsar; yöntemler, bir sınıfın parçası olan fonksiyonlardır. Python'ın veri tipleriyle ilişkili pek çok yerleşik yöntemi vardır. Bu hata mesajını üreten bir başka örneğe bakalım:

name = "DataCamp"
print(name.count["a"])
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

Genel olarak fonksiyonlarda olduğu gibi .count() yöntemi de parantez gerektirir:

print(name.count("a"))
3

Bu senaryo, giriş bölümündeki .append() liste yöntemini içeren örneğe benzer. İşte parantez kullanan doğru sürüm:

numbers = [2, 4, 6, 8]
numbers.append(10)
print(numbers)
[2, 4, 6, 8, 10]

TypeError: 'function' object is not subscriptable

Python, kullanıcı tanımlı fonksiyonlarda da benzer bir hata verir:

def greet_person(name):
    print(f"Hello {person}")
   
greet_person["James"]
Traceback (most recent call last):
  ...
TypeError: 'function' object is not subscriptable

Ancak, greet_person() fonksiyonu Python'daki yerleşik fonksiyonlardan biri değildir. Hata mesajı bunun 'builtin_function_or_method' değil, bir 'function' olduğunu belirtir.

Hata mesajının ikinci bölümü 'subscriptable' terimine atıf yapar. Bir Python nesnesi, köşeli parantez kullanarak öğelerinden birine erişebiliyorsak subscriptable kabul edilir. Subscriptable bir nesneye yaygın bir örnek, köşeli parantezle indekslenebilen bir dizidir (sequence):

print(numbers[0])
print(numbers[-1])
print(numbers[1:4])
2
10
[4, 6, 8]

Demetler (tuple) ve dizgeler (string) diğer dizi örnekleridir. Dolayısıyla onlar da subscriptable'dır:

more_numbers = 10, 30, 50
print(more_numbers[0])
name = "DataCamp"
print(name[0])
10
'D'

Python eşleştirmeleri (mapping) de subscriptable'dır. Python'daki en yaygın eşleştirme sözlüktür:

points = {"James": 10, "Mary": 14}
print(points["Mary"])
14

Sözlüklerde köşeli parantez içinde indeks yerine anahtarlar kullanılır.

Python: Callable vs. Subscriptable

Diziler ve eşleştirmeler, subscriptable Python nesnelerine örnektir. Veri yapısının içindeki bir nesneye erişmek için nesne adının ardından köşeli parantez kullanabiliriz. Bir Python sınıfı, .__getitem__() özel yöntemini tanımlıyorsa subscriptable nesneler oluşturur.

Fonksiyonlar ve yöntemler, çağrılabilir nesnelere örnektir. Nesne adının ardından parantez kullanarak onları çağırabiliriz. Bir fonksiyon ya da yöntemi çağırmak, fonksiyon tanımındaki kodu çalıştırır.

Sınıflar da başka bir çağrılabilir Python nesnesidir. Bir sınıfı çağırmak bir örnek (instance) oluşturur. Genel olarak, bir Python nesnesi, sınıfı .__call__() özel yöntemini tanımlıyorsa çağrılabilir kabul edilir.

Çağrılamayan bir nesneyi çağırmaya çalıştığımızda Python benzer bir hata mesajı verir:

numbers = [2, 4, 6, 8]
print(numbers(0))
Traceback (most recent call last):
  ...
TypeError: 'list' object is not callable

numbers değişkeni bir listedir ve çağrılabilir değildir. Listeden ilk öğeye erişmenin doğru yolu köşeli parantez kullanmaktır: numbers[0]. Python'da en yaygın çağrılabilir nesneler fonksiyonlar, yöntemler ve sınıflardır.

'builtin_function_or_method' object is not subscriptable Hatasını Düzeltme

Python, bir fonksiyon veya yöntemin hemen ardından köşeli parantez geldiğinde ``'builtin_function_or_method' object is not subscriptable` hata mesajını verir. Fonksiyon veya yöntem adının hemen ardından gelen köşeli parantezlere dikkat edin ve bunları parantezlerle değiştirin.

Bazı durumlarda, bir fonksiyon veya yöntem argüman olarak köşeli parantezlerle tanımlanan bir liste alır. Ancak, listenin parantezlerin içinde tanımlandığına dikkat edin:

number_of_values = len([10, 30, 50])
print(number_of_values)
numbers = [2, 4, 6, 8]
numbers.extend([10, 12])
print(numbers)
3
[2, 4, 6, 8, 10, 12]

Bu örneklerde, fonksiyon veya yöntem adını parantezler izler. Parantezlerin içindeki argüman bir listedir. Liste tanımlamak için kullanılan köşeli parantez gösterimi, diziler, eşleştirmeler ve diğer subscriptable nesnelerle kullanılan köşeli parantez gösteriminden farklıdır.

Hata Ayıklama İpuçları

Yapabileceğiniz şeylerden biri, yerleşik type() fonksiyonunu kullanarak nesne türünü kontrol etmektir:

print(type(print))
numbers = [2, 4, 6, 8]
print(type(numbers.append))
<class 'builtin_function_or_method'>

Çıktı, nesnenin çağrılabilir bir yerleşik fonksiyon veya yöntem olduğunu doğrular. Ayrıca, argümanı çağrılabilir ise True döndüren callable() adlı bir yerleşik fonksiyon da vardır:

print(callable(numbers.append))
True

Dikkate alabileceğiniz diğer hata ayıklama ipuçları:

  • Parantez veya köşeli parantez türünü kontrol edin. Fonksiyonlar ve yöntemler gibi çağrılabilirler parantezle takip edilmelidir. Köşeli parantezler; diziler, eşleştirmeler ve diğer subscriptable nesneler için kullanılır.
  • Hata mesajındaki yerleşik fonksiyonlara veya yöntemlere ve subscriptable nesnelere yapılan atıflardan ipuçları arayın. Hata mesajlarındaki satır numarası, hatanın bulunduğu satırı gösterir.

Sonuç

Python gibi programlama dilleri, farklı amaçlar için farklı işaretler kullanır. Bir veri yapısındaki öğeye erişmek için nesne adının hemen ardından köşeli parantez kullanılır. Bu köşeli parantez gösterimi, subscriptable nesnelerde çalışır. Köşeli parantezler, bir nesne adını hemen takip etmediklerinde liste oluşturmak için de kullanılır.

Parantezler ise bir nesne adının ardından nesneyi çağırmak için kullanılır. Fonksiyonlar ve yöntemler, Python'daki çağrılabilir nesnelere örnektir. Parantezler ayrıca Python'da demetlerle ilişkilidir ve gerektiğinde bir ifadenin bölümlerini gruplamak için kullanılır.

Python, yerleşik bir fonksiyon veya yöntemi köşeli parantezlerin izlemesi durumunda 'builtin_function_or_method' object is not subscriptable istisnasını yükseltir. Bir fonksiyon veya yöntemi çağırmanın doğru yolu parantez kullanmaktır.

Fonksiyonlar hakkında daha fazla bilgiyi DataCamp'in Python Fonksiyonları: Fonksiyonlar Nasıl Yazılır ve Çağrılır içeriğinde okuyabilirsiniz.

Stephen Gruppetta

Yazar

Stephen Gruppetta

Malta Üniversitesi’nde lisans düzeyinde Fizik ve Matematik okudum. Ardından Londra’ya taşındım ve Imperial College’da Fizik alanında doktoramı tamamladım. İnsan retinasını görüntülemek için yeni optik teknikler üzerine çalıştım. Şimdi Python hakkında yazmaya, Python’u anlatmaya ve Python öğretmeye odaklanıyorum.

Konular

İlgili