Input ile def fonksiyonunu çalıştırma

mesala kodumuz bu
def test():
print(“test kodu”)
soru=input("kod: ")

eğer test fonksiyonu var ise input ile fonksiyonun işlemlerini yapabilelim

def test():

    print("Test fonksiyonu çalıştı")

while True:
    soru = input("Çalışacak fonksiyonun adı >> ")

    if soru == "test":
        test()

    else:
        print("Hatalı bir veri girişi yaptınız, lütfen tekrar deneyiniz...")
1 Beğeni

ama bana bütün oluşturulan fonksiyonları bulmasını istiyorum

her fonksiyonun isminin koşul olarak sağlandığı if elif blokları oluşturmalısın o zaman. burada sadece test fonksiyonunu gösterdiğin için onu yazdım.

Ayrıca bu bir koşul durumu. Yani adam test yazdı diye test fonksiyonu çalışmıyor. Sadece koşul sağlanıyor ve sağlanan koşul üzerine tanımlanan fonksiyon çalışıyor

>>> def f1(): print("f1 çalıştı.")
...
>>> def f2(): print("f2 çalıştı.")
...
>>> komutlar = dict(f1=f1, f2=f2)
>>> komutlar[input()]()
f1
f1 çalıştı.
>>>

@EkremDincel teşekkürler

Ben de, şunu⬇️ eklemek istiyorum. Yalınız, bunun pek sağlıklı bir yöntem olmadığını belirtmek isterim. Bu kodu yazarken bile pek çok dezavantajı ile karşılaştım, sadece “Belki faydası olur, fikir verebilir.” diye paylaşıyorum.

###Fonksiyon tanımlamaları...###
def f1(x):
  print(f"f1, '{x}' parametresiyle çalıştı.")

def f2():
  print("f2 çalıştı.")
#############################################

###Fonksiyonların bir sözlük(dict) haline getirilmesi...###
komutlar = {}
for i in list(globals().values()):
  if isinstance(i, type(lambda:None)):# düzenlendi.
    komutlar[i.__code__.co_name] = i
#############################################

print("Fonksiyonlar:", *komutlar.keys(), sep="\n")

###Girdilerin kontrol edilip işletildiği kısım...### 
while True:
  ad = input("\nFonksiyon Adı> ")
  
  if globals()[ad].__code__.co_argcount:
    prm = input("Parametreler> ")
    komutlar[ad](prm)

  else: komutlar[ad]()
#############################################

Kod hatalı çünkü str'ye çevrildiğinde "<function" ile başlayan herhangi bir şeyi komutlara dahil ediyor, i.__code__ kısmında hata vermesi çok muhtemel. Ayrıca çok okunaksız, koda bakıp komutlar'ın neleri içereceğini anlamak zor. globals()'in kullanılması zaten yanlış.

Ben böyle durumlarda şunun gibi bir şey yapıyorum:

def komut_oluşturucu():
    l = {}
    def komut(f):
        l[f.__name__] = f
        return f
    return l, komut

komutlar, komut = komut_oluşturucu()

@komut
def f1():
    print("f1 çalıştı.")

@komut
def f2():
    print("f2 çalıştı.")

print("Fonksiyonlar:", *komutlar.keys(), sep="\n")

while True:
    ad = input("\nFonksiyon Adı> ")
    komutlar[ad]()

:sweat_smile: Sanırım, bir program ile çok fazla uğraşınca insanın ufku daralıyor ve böyle okunaksız kodlar ortaya çıkıyor.


Bunu, işi otomatikleştirmek için kullandım.


Evet, zaten pek sağlıklı bir yöntem olmadığını belirttim. Sizin ki, Python’un, “Bir kere yaz, her yer de kullan!” anlayışına daha uygun oldu.