2012-03-02 21 views
63

Mam funkcję Python, która ma kilka argumentów. Niektóre z tych argumentów można pominąć w niektórych scenariuszach.Jak utworzyć funkcję Python z opcjonalnymi argumentami?

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None): 
    #code 

Argumenty d przez h są ciągi których każdy ma różne znaczenia. Ważne jest, abym mógł wybrać, które parametry opcjonalne należy przekazać 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 (są to moje wybory).

Byłoby świetnie, gdybym mógł przeciążyć funkcję - ale czytałem, że Python nie obsługuje przeciążania. Próbowałem wstawić niektóre wymagane argumenty int na liście - i otrzymałem błąd niezgodności argumentu.

W tej chwili wysyłam puste ciągi w miejsce pierwszych kilku brakujących argumentów jako symboli zastępczych. Chciałbym móc wywołać funkcję tylko przy użyciu rzeczywistych wartości.

Czy jest jakiś sposób to zrobić? Czy mogę przekazać listę zamiast listy argumentów?

Teraz prototyp używając ctypes wyglądał:

_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] 
+0

Related: [Co robi ** (podwójna gwiazda/gwiazdka) i * (gwiazdka/gwiazdka) zrobić dla parametrów ?] (https://stackoverflow.com/q/36901/3357935) –

Odpowiedz

74

Spróbuj zadzwonić to lubią: obj.some_function('1', 2, '3', g="foo", h="bar"). Po wymaganych argumentach pozycyjnych można podać określone opcjonalne argumenty po nazwie.

94

Po prostu użyj parametru * args, który pozwala przekazać tyle argumentów, ile chcesz po swoim a,b,c. Trzeba dodać trochę logiki, aby odwzorować args-> c, d, e, f, ale jest to "sposób" przeciążenia.

def myfunc(a,b, *args, **kwargs): 
    for ar in args: 
     print ar 
myfunc(a,b,c,d,e,f) 

I będzie drukować c,d,e,f


Podobnie można użyć argumentu kwargs a następnie można wymienić swoje parametry.

def myfunc(a,b, *args, **kwargs): 
     c = kwargs.get('c', None) 
     d = kwargs.get('d', None) 
     #etc 
myfunc(a,b, c='nick', d='dog', ...) 

A potem kwargs miałoby słownika wszystkich parametrów, które są kluczowym wyceniane po a,b

+0

Dziękuję. Chociaż nie mogę użyć tej dużej elastyczności w moim kodzie i nie rozwiązuje ona mojego problemu z wywołaniem z różnymi pustymi dziurami na mojej liście, jest to świetne narzędzie do wykorzystania w innym projekcie. i Russel Borogove udzielił mi dokładnej odpowiedzi, której potrzebowałem do mojego problemu, jestem szczęśliwy. – Thalia

+5

Nazywa się [Arbitrary Argument Lists] (http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists) – FabienB

Powiązane problemy