Apa cara terbaik untuk memanggil fungsi yang diberi string dengan nama fungsi dalam program Python. Sebagai contoh, katakanlah saya memiliki modul foo
, dan saya memiliki string yang isinya "bar"
. Apa cara terbaik untuk menelepon foo.bar()
?
Saya perlu mendapatkan nilai kembali fungsi, itulah sebabnya saya tidak hanya menggunakan eval
. Saya menemukan cara melakukannya dengan menggunakan eval
untuk mendefinisikan fungsi temp yang mengembalikan hasil pemanggilan fungsi itu, tapi saya berharap ada cara yang lebih elegan untuk melakukan ini.
foo
modul yang dapat Anda gunakanglobals()
untuk melakukan hal ini:methodToCall = globals()['bar']
atau
penduduk setempat mengembalikan kamus dengan tabel simbol lokal saat ini. global mengembalikan kamus dengan tabel simbol global.
sumber
Solusi Patrick mungkin yang terbersih. Jika Anda juga perlu mengambil modul secara dinamis, Anda dapat mengimpornya seperti:
sumber
importlib.import_module
. Dokumen resmi mengatakan tentang__import__
: "Ini adalah fungsi lanjutan yang tidak diperlukan dalam pemrograman Python sehari-hari, tidak seperti importlib.import_module ()." docs.python.org/2/library/functions.html#__import__importlib.import_module
didukung di 3.6. Lihat docs.python.org/3.6/library/…Kontribusi sederhana. Jika kelas yang perlu kita contoh berada di file yang sama, kita dapat menggunakan sesuatu seperti ini:
Sebagai contoh:
Dan, jika bukan kelas:
sumber
Diberikan string, dengan jalur python lengkap ke suatu fungsi, ini adalah bagaimana saya mendapatkan hasil dari fungsi tersebut:
sumber
__import__
fungsi yang ringan .Jawaban terbaik menurut FAQ pemrograman Python adalah:
sumber
Jawabannya (saya harap) tidak ada yang mau
Perilaku seperti Eval
Mengapa tidak menambahkan impor otomatis
Jika kami memiliki kamus tambahan yang ingin kami periksa
Kita harus masuk lebih dalam
sumber
Untuk apa nilainya, jika Anda perlu meneruskan fungsi (atau kelas) nama dan nama aplikasi sebagai string, maka Anda bisa melakukan ini:
sumber
handler = getattr(sys.modules[__name__], myFnName)
Coba ini. Meskipun ini masih menggunakan eval, ia hanya menggunakannya untuk memanggil fungsi dari konteks saat ini . Kemudian, Anda memiliki fungsi nyata untuk digunakan sesuai keinginan.
Manfaat utama bagi saya dari ini adalah bahwa Anda akan mendapatkan kesalahan terkait eval pada saat memanggil fungsi. Maka Anda hanya akan mendapatkan kesalahan terkait fungsi saat menelepon.
sumber
eval
kecuali sangat diperlukan.getattr(__module__, method_name)
adalah pilihan yang jauh lebih baik dalam konteks ini.tidak ada yang disarankan membantu saya. Saya memang menemukan ini.
Saya menggunakan python 2.66
Semoga ini membantu
sumber
self.__getattribute__('title')
sama denganself.title
self.__getattribute__('title')
tidak bekerja dalam kasus apapun (tidak tahu mengapa) setelah semua, tetapifunc = getattr(self, 'title'); func();
tidak. Jadi, mungkin lebih baik menggunakangetattr()
bukannyagetattr
sebagai gantinya.Saat pertanyaan ini Bagaimana memanggil metode secara dinamis di dalam kelas menggunakan penugasan metode-nama ke variabel [duplikat] yang ditandai sebagai duplikat seperti ini, saya memposting jawaban terkait di sini:
Skenarionya adalah, sebuah metode di kelas yang ingin memanggil metode lain di kelas yang sama secara dinamis, saya telah menambahkan beberapa detail ke contoh asli yang menawarkan beberapa skenario dan kejelasan yang lebih luas:
sumber
Ini adalah jawaban yang sederhana, ini akan memungkinkan Anda untuk menghapus layar misalnya. Ada dua contoh di bawah ini, dengan eval dan exec, yang akan mencetak 0 di bagian atas setelah membersihkan (jika Anda menggunakan Windows, perubahan
clear
untukcls
, Linux dan Mac pengguna meninggalkan seperti misalnya) atau hanya jalankan, masing-masing.sumber