2013-06-17 26 views
6

Na przykład mam podstawową metodę, która zwróci listę permutacji.Czy istnieje sposób ustawienia domyślnego parametru równego innej wartości parametru?

import itertools 
def perms(elements,setLength=elements): 
    data=[] 
    for x in range(elements): 
     data.append(x+1) 
    return(list(itertools.permutations(data,setLength))) 

Teraz rozumiem, że w obecnym stanie ten kod nie będzie działać, ponieważ drugi elements nie jest zdefiniowana, ale jest tam i elegancki sposób, aby osiągnąć to, co usiłuję zrobić tutaj? Jeśli to nadal nie jest jasne, chcę, aby domyślna wartość setLength była równa pierwszemu argumentowi przekazanemu. Dzięki.

+0

Wydaje się, że 3 osoby zgadzają się co do rozwiązania. Zapoznaj się również z "Ważnym ostrzeżeniem" na http://docs.python.org/3/tutorial/controlflow.html#default-argument-values – Josay

Odpowiedz

14

Nie, wartości domyślne parametrów funkcji są określane, gdy funkcja definiuje, a nie gdy funkcja jest wykonywana.

ustawić domyślny do None i wykryć, że:

def perms(elements, setLength=None): 
    if setLength is None: 
     setLength = elements 

Jeśli potrzebujesz, aby móc określić None jako argumentu, należy użyć innej wartości wskaźnikowych:

_sentinel = object() 

def perms(elements, setLength=_sentinel): 
    if setLength is _sentinel: 
     setLength = elements 

Teraz rozmówcy mogą ustawić setLength do None i nie będzie to postrzegane jako domyślne.

4

Ze względu na sposób Python obsługuje wiązania i parametrów domyślnych ...

Standardowym sposobem jest:

def perms(elements, setLength=None): 
    if setLength is None: 
     setLength = elements 

I kolejna opcja to:

def perms(elements, **kwargs): 
    setLength = kwargs.pop('setLength', elements) 

Chociaż ta wymaga jawnie użyj perms(elements, setLength='something else'), jeśli nie chcesz domyślnego ...

4

Powinieneś zrobić coś takiego:

def perms(elements,setLength=None): 
    if setLength is None: 
     setLength = elements 
Powiązane problemy