Python Fonksiyon Sınıfı(bir fonksiyonun parametrelerini bulma) Hakkında0

Merhaba,

Örneğin elimde verilen a,b,c,d parametlerini yazdıran bir fonksiyon olsa, fonksiyon sınıfının herhangi bir metot veya fonksiyonuyla fonksiyonu tanımlarken parantez içerisine yazıdığımız bu parametre adlarını elde edebilir miyim? Bunu yapmanın bir yolu var mıdır?

Yapmak istediğim uygulama şu şekilde ;
Elimde bir programın kaynak kodları var (kodlar dağınık sınıf ve fonksiyonlar halinde) ve bu programa bir grafik arayüzü yazmak istiyorum, ancak grafik arayüzü programlarken kolaylık olması açısından dağınık halde bulunan tüm fonksiyonları fonksiyon objesini ve parametre listesini parametre alarak çağırabilecek tek bir fonksiyon yazmak.

import inspect

def func(a,b,c=5):
    pass

inspect.getargspec(func)  # inspect.signature(func) in Python 3

(['a', 'b', 'c'], None, None, (5,))

Kaynak

Şu şekilde bir çözüm yolu buldum:

def cagirici(fonksiyon,liste):
    fonksiyon(*args)

Şöyle olmalı sanki:

def cagirici(fonksiyon,*args):
    fonksiyon(*args)

Ama fonksiyonların parametrelerini nasıl aldınız?

Kusura bakmayın, dalgınlığıma gelmiş. Parametre isimleri konusunda da fonksiyonları bu bilgiye ihtiyaç kalmayacak şekilde düzenledim. Ayrıca, projenin grafik arayüzünü ve diğer bileşenlerini böyle bir core sınıfına ve fonksiyonuna bağlamanın verimli olup olmadığı konusunda şüphelerim var, sizin bu konu hakkındaki düşüncelerinizi öğrenebilir miyim acaba?

*args ve **kwargs’ ın ne anlama geldiğini biliyorsanız
aslında args ve kwargs magic word degillerdir. Python programcıları tarafından konulmuştur
siz buraya *moz4rt yazarsanız da aynı işlevi yapacaktır bir fonksiyonunuz olsun diyelim bu fonksiyon çok sayıda parametre alabilir o zaman *args kullanmak doğru olacaktır.
Eğer fonksiyonunuz 2 parametre alıyor ve diğerini kullanıcıya bırakıyorsa parametreleri tanımlayıp birine None koymak daha doğru olacaktır.

you do not know beforehand how many arguments can be passed to your function by the user

User tarafından tanımlanacak kaç tane argüman olduğunu bilmediğiniz zamanlar da kullanabilirsiniz.
Genel olarak fonksiyon decorator yaparken kullanılır.

Ayriyetten core sınıfına bağlamak yanlış değil fakat kodları görebilirsek daha güzel olur.

Şu yol da denenebilir.

def get_parameters(func):
    keys = func.__code__.co_varnames[:func.__code__.co_argcount][::-1]
    sorter = {j: i for i, j in enumerate(keys[::-1])} 
    values = func.__defaults__[::-1]
    kwargs = {i: j for i, j in zip(keys, values)}
    sorted_args = tuple(
        sorted([i for i in keys if i not in kwargs], key=sorter.get)
    )
    sorted_kwargs = {
        i: kwargs[i] for i in sorted(kwargs.keys(), key=sorter.get)
    }     
    return sorted_args, sorted_kwargs
    

def f(a, b, c="hello", d="world"): var = a
    

print(get_parameters(f))

Çıktı:

(('a', 'b'), {'c': 'hello', 'd': 'world'})

Aşağıda gösterildiği gibi inspect modülünü kullanmak daha mantıklı olur.

Edit: İlk posta baksaydım keşke :​P

img