Saya mencoba memanggil fungsi di dalam fungsi lain dengan python, tetapi tidak dapat menemukan sintaks yang tepat. Yang ingin saya lakukan adalah sesuatu seperti ini:
def wrapper(func, args):
func(args)
def func1(x):
print(x)
def func2(x, y, z):
return x+y+z
wrapper(func1, [x])
wrapper(func2, [x, y, z])
Dalam hal ini panggilan pertama akan berfungsi, dan yang kedua tidak. Yang ingin saya modifikasi adalah fungsi wrapper dan bukan fungsi yang dipanggil.
def wrapper(func, *args)
adalah apa yangmethod(params object[] args)
ada di C #.*args
harus menjadi argumen terakhir dalam definisi fungsi.The * next to args means "take the rest of the parameters given and put them in a list called args".
Itu menempatkan mereka dalam sebuah tuple, bukan daftar.Cara paling sederhana untuk membungkus suatu fungsi
... adalah menulis secara manual pembungkus yang akan memanggil func () di dalamnya:
Dalam fungsi Python adalah sebuah objek, sehingga Anda dapat meneruskan namanya sebagai argumen dari fungsi lain dan mengembalikannya. Anda juga dapat menulis generator pembungkus untuk fungsi anyFunc () :
Harap perhatikan juga bahwa dalam Python ketika Anda tidak tahu atau tidak ingin menyebutkan semua argumen dari suatu fungsi, Anda bisa merujuk ke beberapa argumen, yang dilambangkan dengan namanya, didahului dengan tanda bintang di tanda kurung setelah nama fungsi:
Misalnya, Anda dapat mendefinisikan fungsi yang akan mengambil sejumlah argumen:
Python menyediakan manipulasi lebih jauh pada argumen fungsi. Anda dapat mengizinkan suatu fungsi untuk mengambil argumen kata kunci. Dalam badan fungsi argumen kata kunci disimpan dalam kamus. Dalam tanda kurung setelah nama fungsi kamus ini dilambangkan dengan dua tanda bintang diikuti oleh nama kamus:
Contoh serupa yang mencetak kamus argumen kata kunci:
sumber
Anda bisa menggunakan sintaks * args dan ** kwargs untuk argumen panjang variabel.
Apa yang dimaksud * args dan ** kwargs?
Dan dari tutorial python resmi
http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
sumber
Jawaban literal untuk pertanyaan Anda (untuk melakukan persis seperti yang Anda minta, mengubah hanya pembungkus, bukan fungsi atau fungsi panggilan) hanya untuk mengubah baris
untuk membaca
Ini memberitahu Python untuk mengambil daftar yang diberikan (dalam hal ini,
args
) dan meneruskan isinya ke fungsi sebagai argumen posisional.Trik ini berfungsi di kedua "sisi" panggilan fungsi, jadi fungsi yang didefinisikan seperti ini:
akan dapat menerima argumen posisi sebanyak yang Anda melemparkannya, dan menempatkan semuanya ke dalam daftar yang disebut
args
.Saya harap ini membantu sedikit memperjelas hal-hal. Perhatikan bahwa ini semua dimungkinkan dengan argumen dikts / kata kunci juga, menggunakan
**
bukan*
.sumber
Anda perlu menggunakan argumen membongkar ..
sumber
Tambahan kecil untuk jawaban sebelumnya, karena saya tidak dapat menemukan solusi untuk masalah, yang tidak layak membuka pertanyaan baru, tetapi membawa saya ke sini.
Berikut ini adalah cuplikan kode kecil, yang menggabungkan
lists
,zip()
dan*args
, untuk menyediakan pembungkus yang dapat menangani sejumlah fungsi yang tidak diketahui dengan jumlah argumen yang tidak diketahui.Perlu diingat, itu
zip()
tidak memberikan pemeriksaan keamanan untuk daftar panjang yang tidak sama, lihat zip iterators yang menyatakan panjangnya sama dengan python .sumber