Python'da function overloading neden yok?

Yaptığım araştırmalar sonucu python da function overloading imkanın olmadığını öğrendim. Bununla ilgili çeşitli alternatifler var sanırım. Ancak dili yeni öğrenmeye başladığım için onları çok anlamadım. Merak ettiğim şey function overloading işlemini basit şekilde yapabilir miyiz? Ve neden pythonda bu imkan yok. Bu kadar kullanışlı bir şeyi koymadılarsa bir sebebi vardır diye düşünüyorum. Teşekkürler.

Öncelikle function overloading denilen şeyin ne amaçla kullanıldığını düşünmek lazım. Bir fonksiyonu, mantıkta aynı işlemi yapmak üzere farklı veri tipleri ile çalışmak. Bu, Java’da var olan bir özellik ve Java üzerinden örnek vermek isterim. Java’da metoda gönderilecek parametrelerin tipini belirtmek zorundayız. Sadece sayıları toplamak üzere yazdığınız bir metodu, float tipinde iki sayıyı toplamak için kullanamıyorsunuz ve böylece aynı isimli ama bu sefer float tipinde iki sayı alan yeni bir metot olarak tanımlıyorsunuz.

Bu işlemler statik programlama dilleri için geçerlidir. Python dinamik bir programlama dili olduğu için konsept olarak overloading uygulanamaz.

Java’da istersek metodun kabul ettiği veri tipini sadece Object olarak tanımlarız ve böylece tüm veri tiplerini kabul edebiliriz. Ama bu sefer de metot içerisinde acaba hangi veri tipi geldi diye kontrol etmek zorunda kalırız.

Aynı sıkıntıyı Python içerisinde de yapmak zorunda kalacağız. Gelen veriyi tipine göre ayırt etmek ve veri tipine göre ilgili işlemi yapmak. Bu tanılama işlemini fonksiyon içerisinde yapmak istemezseniz, bize yalancı bir overloading imkanı sunan, functools paketi altındaki singledispatch dekoratörünü kullanabilirsiniz.

Örnek basit bir kod

# coding: utf-8

from functools import singledispatch

@singledispatch
def patcher(arg):
	print("Bilinmeyen veri tipi")

@patcher.register
def fonksiyon(arg: int):
    print("Integer tipi")

@patcher.register
def fonksiyon(arg: str):
    print("string tipi")

patcher(1)
patcher("string")
patcher(5.0)

Kaynak: functools — Higher-order functions and operations on callable objects — Python 3.9.6 documentation

2 Beğeni

Şuan siz açıklayınca çok temel bir nedeni olduğunu kavradım. Yeni başladığım için böyle basit bir durumu farkedemedim sanırım. Çok teşekkürler. Ancak açıklamanızı okurken aklıma şu da geldi. Hatırladığım kadarıyla bu işlemi yapma sebebimiz sadece aynı adrese sahip fonksiyonlara farklı veri tiplerinde parametre değerleri yollamak değildi. Aynı zamanda farklı parametre sayılarında parametre yollamak için de kullanıyorduk. Yoksa yanlış mı hatırlıyorum? Bir diğer sormak istediğim şeyde şu. Okuduğum bazı yazılarda bu işlemin pek tavsiye edilmediği üzerine. Ayrıca pythonda birçok işi sürekli kütüphaneler yardımıyla yapıyoruz. Bu diğer dillerde de böyle elbette ancak pythonda bu kütüphanelerin geliştiricileri anladığım kadarıyla bağımsız gruplar veya kişiler. Bu durum bir güvenlik sorunu olulturur mu? Örneğin ben veri tabanı işlemleri yapacak olsam ve bunun için bir kütüphane indirsem bu bir sorun oluşturur mu?

1 Beğeni

Doğru hatırlıyorsunuz, aklıma ilk parametre tipleri geldiği için o yönden örnek verdim.

Gerektiği yerlerde kullanmakta sakınca yok.

Varsa önce dahili olan modülleri, yoksa da topluluk tarafından kabul görmüş modül ve kütüphaneleri kullanmakta sakınca yok. Eğer bir güvenlik zaafiyeti tespit edilirse zaten topluluk tarafından hızlı bir şekilde kapatılır ve güncelleme yayınlanır. Kütüphanelerin çok büyük çoğunluğu açık kaynak kodlu.

1 Beğeni