[Çözüldü] Bu kodun mantığını biri açıklayabilir mi?

Başlatan uçbirim2002, 26 Mart 2016 - 23:57:52

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

uçbirim2002

Python fonksiyonları aşırı yüklemek için internnte araştırma yaptım ve sonun da bu kodu buldum:

# This is in the 'mm' module

registry = {}

class MultiMethod(object):
    def __init__(self, name):
        self.name = name
        self.typemap = {}
    def __call__(self, *args):
        types = tuple(arg.__class__ for arg in args) # a generator expression!
        function = self.typemap.get(types)
        if function is None:
            raise TypeError("no match")
        return function(*args)
    def register(self, types, function):
        if types in self.typemap:
            raise TypeError("duplicate registration")
        self.typemap[types] = function

def multimethod(*types):
    def register(function):
        function = getattr(function, "__lastreg__", function)
        name = function.__name__
        mm = registry.get(name)
        if mm is None:
            mm = registry[name] = MultiMethod(name)
        mm.register(types, function)
        mm.__lastreg__ = function
        return mm
    return register


Ama ne kadar uğraşsam da çalışma mantığını çözemedim. Bu kodun çalışma mantığı tam olarak nedir?
Hello!


uçbirim2002

Maalesef İngilizcem fazla olmadığı için verdiğniz bağlantıları anlamam mümkün olmadı.
Hello!

egcodes

#3
Python'da overload (aşırı yükleme) diğer dillerdeki gibi (java, c$) desteklenmiyor. Çok da gerekli bir özellik değil zaten bence.
Ama bir iki numara var. Şöyle yapabilirsin.

Not: Yolladığın kodun ne olduğunu çözemedim biraz araştırcınca dilin yaratıcısı (Guido van Rossum) tarafından multimethod için geliştirdiği bir kod olduğunu öğrendim.

1) Metod'un kaç adet parametre alacaksa o şekilde bir metod tasarla ve hepsine default None değeri ata.
2) Metod'un içerisinde tüm parametrelerin if elif ile kontrol et buna göre kodunu çalıştır.

Bu şekilde metod'u farklı farklı parametreler ile çağırabilirsin.


Gözünde canlanması için örnek buldum bir tane. myFunction method'u farklı parametreler ile çağrılabilmiş örneğin.

def myfunction(first, second, third = None):
    if third is None:
        #just use first and second
    else:
        #use all three

myfunction(1, 2) # third will be None, so enter the 'if' clause
myfunction(3, 4, 5) # third isn't None, it's 5, so enter the 'else' clause

1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

uçbirim2002

#4
Bazen fonksiyon içinde yaptığım işler aşırı derece de karışabliyor. Bir de buna parametre kontrolü ekledğim de siz hayal edin :) Verdiğiniz örnek küçük bir fonksiyon. Bu yüzden basit if kontrolleri ile halledilebiliyor.

Mesela ben birinci parametre str, ikinci int olduğun da, veya ilk iki parametre int olduğun da işlemleri yapmam gerekirse? Bu sefer her if kontrolü içine yazdığım kodları tekrarlamam gerekiyor.

Daha karışık fonksiyonlar da, basit if kontrolleri yapabilir miyim?
Hello!

egcodes

Yazdığın method'a bağlı bu method kaç çeşit overload olacak ki önce onu sorayım o zaman? Yani kaç değişik kombinasyonu var. Eğer çok var ise o zman dediğim gibi yazdığınınz method'un mantığını değiştirin çünkü overload yok python'da.

Örnek paylaşabilrseniz yada ne yapmaya çalıştığınızı daha net görebiliriz problemi belki.

myfunction(1,)
myfunction(2, 3)
myfunction(4, 5, 6)
...
..
.
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

uçbirim2002

Aslında tek bir metod için değil. Kendime bir kütüphne hazırlıyorum. Bu gösterdiğim kodu da kütüphaneye eklemek istedim ama mantığını kavrayamadım.

Bu yüzden kesin bir şey söyliyemem. Herhangi bir projede bunu kullanmak istiyorum. Ne zaman lazım olacağım belli olmaz :) Kaç tane overload gerekeceği de belli olmaz.
Hello!

egcodes

O kodu multimethods.py olarak kaydedip aşağıdaki gibi bir kod yazıp çağırırsan koddaki gibi add_bullet method'unu overload yapabilrsin. Bu şekilde kullanılıyormuş.

Mantığını bilmiyorum çok teorik bir konu benim için :)
Horoza sormuşlar. Yumurta mı tavuktan çıkar tavuk mu yumurtadan. Horoz demiş ki : "Bana ne kardeşim ben işime bakarım " :)

from multimethods import multimethod
import unittest

# 'overload' makes more sense in this case
overload = multimethod

class Sprite(object):
    pass

class Point(object):
    pass

class Curve(object):
    pass

@overload(Sprite, Point, Direction, int)
def add_bullet(sprite, start, direction, speed):
    # ...

@overload(Sprite, Point, Point, int, int)
def add_bullet(sprite, start, headto, speed, acceleration):
    # ...

@overload(Sprite, str)
def add_bullet(sprite, script):
    # ...

@overload(Sprite, Curve, speed)
def add_bullet(sprite, curve, speed):
    # ...
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

uçbirim2002

#8
yardımınız içn teşekkürler
Hello!