NumPy'deki bu hata, bir ndarray dizisinin fonksiyon gibi parantezle çağrıldığını gösterir. Önce traceback'teki hatalı satırı bulun, ardından parantez içeren ifadenin türünü
Burada Python,
Kodun çalıştığı Python ortamında, hatayı üreten satıra gitmek yeterli değildir; parantezden önceki nesnenin türünü de doğrulamak gerekir.
Tablodaki son satır önemli bir ayrımdır: Her parantez hatalı değildir.
Aşağıdaki örnekte üç farklı erişim biçimi karşılaştırılır:
Bazen hata satırında doğrudan dizi çağrılmaz; bir fonksiyon adı daha önce diziyle ezilmiş olabilir:
Burada
Tanılama çıktısında tür
type() ile doğrulayın. İfade gerçekten numpy.ndarray ise kullanım amacına göre () yerine indeksleme, öznitelik erişimi veya doğru bir dizi yöntemi kullanıldığında hata ortadan kalkar.Hatanın anlamı
ndarray, NumPy'nin çok boyutlu dizi nesnesidir. Fonksiyonlar gibi çağrılabilir değildir. Bu nedenle aşağıdaki varsayımsal örnek hata üretir:
Python:
import numpy as np
sayilar = np.array([10, 20, 30])
sonuc = sayilar()
Burada Python,
sayilar değişkeninin bir fonksiyon olduğunu varsayarak onu çalıştırmaya uğraşır. Değişkenin değeri dizi olduğu için TypeError: 'numpy.ndarray' object is not callable hatası oluşur.Hatalı ifadenin nasıl araştırılacağı
Kodun çalıştığı Python ortamında, hatayı üreten satıra gitmek yeterli değildir; parantezden önceki nesnenin türünü de doğrulamak gerekir.
- Traceback içindeki ilgili kod satırını bulun. En alttaki satır hata türünü ve mesajını gösterir; dosya ve satır numarası ondan önceki son ilgili traceback kaydındadır. Özellikle
()kullanılan ifadeyi inceleyin.sayilar()diziyi çağırır;sayilar.shape()ise tuple,sayilar.dtype()dtype nesnesini çağırmaya çalışır. Bu son iki durumda hata mesajındaki nesne türünumpy.ndarrayolmayacaktır. - Parantezden önceki nesnenin türünü yazdırın. Hatalı satırdan hemen önce aşağıdaki tanılama kodunu geçici olarak çalıştırın. Çıktı
<class 'numpy.ndarray'>ise sorun, bu nesnenin fonksiyon gibi çağrılmasıdır.
Python:print("değer:", sayilar) print("tür:", type(sayilar)) print("çağrılabilir mi:", callable(sayilar)) - İfadenin amacını belirleyin. Bir eleman almak istiyorsanız köşeli parantez, dizinin özelliğini okumak istiyorsanız nokta gösterimi, hesaplama yapmak istiyorsanız uygun NumPy yöntemi veya işlevi kullanın.
- Düzeltilmiş satırı yeniden çalıştırın. Beklenen çıktı oluşuyorsa geçici
print()satırlarını kaldırın. Hata sürerse parantezden önceki başka bir değişkeni de aynı yöntemle denetleyin; hata her zaman görünen dizi adıyla sınırlı olmayabilir.
| Kod | Anlamı | Doğru kullanım |
|---|---|---|
sayilar() | Diziyi fonksiyon gibi çağırır; hata verir. | sayilar |
sayilar(0) | Dizinin ilk elemanını çağrı gibi almaya çalışır. | sayilar[0] |
sayilar.shape() | shape özniteliğini fonksiyon sanır. | sayilar.shape |
sayilar.dtype() | dtype bilgisini fonksiyon sanır. | sayilar.dtype |
sayilar.sum() | Dizinin sum yöntemini çağırır; bu kullanım geçerlidir. | sayilar.sum() |
sum(), mean() veya reshape() gibi gerçekten yöntem olan üyeler parantezle çağrılabilir. Hata, parantezden önceki nesnenin veya üyenin çağrılabilir olmamasından kaynaklanır.Çalışan en küçük örnek
Aşağıdaki örnekte üç farklı erişim biçimi karşılaştırılır:
Python:
import numpy as np
sayilar = np.array([10, 20, 30])
ilk = sayilar[0]
boyut = sayilar.shape
toplam = sayilar.sum()
print(ilk) # 10
print(boyut) # (3,)
print(toplam) # 60
sayilar[0] ilk elemanı, sayilar.shape dizinin boyut bilgisini, sayilar.sum() ise yöntemi çalıştırarak toplamı verir. sayilar() bu üç işlemden hiçbirini ifade etmez.Parantez doğru görünüyorsa hangi değişkeni kontrol etmeli?
Bazen hata satırında doğrudan dizi çağrılmaz; bir fonksiyon adı daha önce diziyle ezilmiş olabilir:
Python:
import numpy as np
mean = np.array([1, 2, 3])
sonuc = mean([1, 2, 3])
Burada
mean artık bir fonksiyon değil, dizidir. Bu nedenle mean(...) çağrısı başarısız olur. Hatalı addan hemen önce print(type(mean)) çalıştırın. Tür numpy.ndarray çıkarsa değişkene farklı bir ad verin veya fonksiyonu doğru modül adıyla çağırın; örneğin np.mean([1, 2, 3]).Tanılama çıktısında tür
numpy.ndarray değilse hata başka bir çağrılamayan nesneden kaynaklanıyor olabilir. Bu durumda traceback'teki tam ifadeyi ve parantezden önceki her parçanın türünü ayrı ayrı kontrol etmek gerekir.
Son düzenleme: