Próbuję wywołać funkcję wewnątrz innej funkcji w Pythonie, ale nie mogę znaleźć odpowiedniej składni. To, co chcę zrobić, to coś takiego:
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])
W takim przypadku pierwsze połączenie zadziała, a drugie nie. To, co chcę zmodyfikować, to funkcja opakowania, a nie wywoływane funkcje.
def wrapper(func, *args)
jest tym, comethod(params object[] args)
jest w C #.*args
musi to być ostatni argument w definicji funkcji.The * next to args means "take the rest of the parameters given and put them in a list called args".
Umieszcza je w krotce, a nie na liście.Najprostszy sposób na zawijanie funkcji
... polega na ręcznym napisaniu opakowania, które wywoływałoby func () wewnątrz siebie:
W Pythonie funkcja jest obiektem, więc możesz przekazać jej nazwę jako argument innej funkcji i zwrócić ją. Możesz także napisać generator opakowania dla dowolnej funkcji anyFunc () :
Zwróć również uwagę, że w Pythonie, gdy nie znasz lub nie chcesz nazywać wszystkich argumentów funkcji, możesz odwołać się do krotki argumentów, która jest oznaczona nazwą, poprzedzoną gwiazdką w nawiasach po nazwa funkcji:
Na przykład możesz zdefiniować funkcję, która pobierze dowolną liczbę argumentów:
Python umożliwia jeszcze dalsze manipulowanie argumentami funkcji. Możesz zezwolić funkcji na przyjmowanie argumentów słów kluczowych. W treści funkcji argumenty słów kluczowych są przechowywane w słowniku. W nawiasach po nazwie funkcji słownik ten jest oznaczony dwiema gwiazdkami, po których następuje nazwa słownika:
Podobny przykład, który wyświetla słownik argumentów słów kluczowych:
źródło
Możesz użyć składni * args i ** kwargs dla argumentów o zmiennej długości.
Co oznaczają * args i ** kwargs?
I z oficjalnego samouczka Pythona
http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
źródło
Dosłowną odpowiedzią na twoje pytanie (aby zrobić dokładnie to, o co prosiłeś, zmieniając tylko opakowanie, a nie funkcje lub wywołania funkcji) jest po prostu zmiana wiersza
czytać
Mówi to Pythonowi, aby wziął podaną listę (w tym przypadku
args
) i przekazał jej zawartość do funkcji jako argumenty pozycyjne.Ta sztuczka działa po obu „stronach” wywołania funkcji, więc funkcja zdefiniowana w ten sposób:
byłby w stanie zaakceptować tyle argumentów pozycyjnych, ile do niego rzucisz, i umieścić je wszystkie na liście o nazwie
args
.Mam nadzieję, że pomoże to trochę wyjaśnić sprawy. Zauważ, że to wszystko jest również możliwe w przypadku argumentów dicts / słów kluczowych, używając
**
zamiast*
.źródło
Musisz rozpakować argumenty.
źródło
Mały dodatek do poprzednich odpowiedzi, ponieważ nie mogłem znaleźć rozwiązania problemu, którego nie warto otwierać nowego pytania, ale zaprowadził mnie tutaj.
Oto mały fragment kodu, który łączy
lists
,zip()
a*args
, aby zapewnić, że opakowanie może poradzić sobie z nieznaną ilością funkcji z nieznaną ilością argumentów.Należy pamiętać, że
zip()
nie zapewnia to kontroli bezpieczeństwa dla list o nierównej długości, zobacz iteratory zip zapewniające równą długość w Pythonie .źródło