Bir Python programında işlevin adını içeren bir dizge verilen bir işlevi çağırmanın en iyi yolu nedir? Örneğin, diyelim ki bir foo
modülüm var ve içeriği "bar"
olan bir karakter dizisine sahibim. foo.bar()`ı çağırmanın en iyi yolu nedir?
Fonksiyonun geri dönüş değerini almam gerekiyor, bu yüzden sadece eval
kullanmıyorum. Bu fonksiyon çağrısının sonucunu döndüren bir geçici fonksiyon tanımlamak için eval
kullanarak bunu nasıl yapacağımı buldum, ancak bunu yapmanın daha zarif bir yolu olduğunu umuyorum.
Modül foo
ile yöntem bar
varsayılıyor:
import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()
Satır 2 ve 3'ü şu şekilde kısaltabilirsiniz:
result = getattr(foo, 'bar')()
eğer bu sizin kullanım durumunuz için daha mantıklı ise.
Bu şekilde getattr
'i sınıf örneğine bağlı yöntemlerde, modül düzeyindeki yöntemlerde, sınıf yöntemlerinde kullanabilirsiniz... liste uzayıp gider.
Patrick'in çözümü muhtemelen en temiz olanıdır. Modülü dinamik olarak da almanız gerekiyorsa, şu şekilde içe aktarabilirsiniz:
module = __import__('foo')
func = getattr(module, 'bar')
func()