Mam funkcję Python, która pobiera kilka argumentów. Niektóre z tych argumentów można pominąć w niektórych scenariuszach.
def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
#code
Argumenty d
za h
są ciągi których każdy ma różne znaczenia. Ważne jest, że mogę wybrać opcjonalne parametry do przekazania w dowolnej kombinacji. Na przykład, (a, b, C, d, e)
lub (a, b, C, g, h)
, lub (a, b, C, d, e, f
, lub wszystkie z nich (to są moje wybory).
Byłoby wspaniale, gdybym mógł przeciążyć funkcję - ale przeczytałem, że Python nie obsługuje przeciążania. Próbowałem wstawić niektóre wymagane argumenty int na liście - i wystąpił błąd niedopasowania argumentu.
W tej chwili wysyłam puste ciągi zamiast kilku pierwszych brakujących argumentów jako symbole zastępcze. Chciałbym móc wywoływać funkcję przy użyciu rzeczywistych wartości.
Czy jest na to sposób? Czy mogę przekazać listę zamiast listy argumentów?
W tej chwili prototyp używający ctypów wygląda mniej więcej tak:
_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]
Odpowiedzi:
Spróbuj nazywając go tak:
obj.some_function( '1', 2, '3', g="foo", h="bar" )
. Po wymaganych argumentach pozycyjnych można podać konkretne opcjonalne argumenty według nazwy.źródło
Wystarczy użyć
*args
parametru, który pozwala przekazać tyle argumentów, ile chcesz po swoima,b,c
. Trzeba by dodać trochę logiki do mapyargs
->c,d,e,f
ale to „sposób” przeciążenia.I wydrukuje wartości
c,d,e,f
Podobnie możesz użyć
kwargs
argumentu, a następnie nazwać swoje parametry.A następnie
kwargs
miałby słownik wszystkich parametrów, po których kluczowa jest wartośća,b
źródło
c = kwargs.get('c', None)
służy to oświadczenie ? Czy jest wymagany we wszystkich funkcjach, które mają opcjonalne argumenty? W twoim kodzie masz tylko 2 opcjonalne argumenty. Co jeśli użytkownik chce powiedzieć inny argumente
? Jak mogę zmienić swój przykładowy kod dla każdej nieznanej liczby opcjonalnych args, ex:def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)
? Czy muszę toc = kwargs.get('c', None) etc
zrobić przed wykonaniemobj.add(c, d, ...)
?