2013-06-17 9 views
6

Zum Beispiel habe ich eine grundlegende Methode, die eine Liste von Permutationen zurückgibt.Gibt es eine Möglichkeit, einen Standardparameter gleich einem anderen Parameterwert festzulegen?

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

Jetzt verstehe ich, dass in seinem aktuellen Zustand dieser Code nicht ausgeführt werden, weil die zweiten elements nicht definiert ist, aber gebe es und elegante Art und Weise zu erreichen, was ich versuche, hier zu tun? Wenn das immer noch nicht klar ist, möchte ich den Standardwert setLength Wert gleich dem ersten Argument übergeben. Danke.

+0

Es scheint, wie 3 Personen auf der Lösung zustimmen. Bitte beachten Sie auch die "Wichtige Warnung" unter http://docs.python.org/3/tutorial/controlflow.html#default-argument-values – Josay

Antwort

14

Nein, Funktions-Schlüsselwortparameter-Standardwerte werden bestimmt, wenn die Funktion definiert ist, nicht wenn die Funktion ausgeführt wird.

die Standardeinstellung None Stellen und erkennen, dass:

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

Wenn Sie angeben, None als Argument in der Lage sein müssen, verwenden Sie einen anderen Sentinel-Wert:

_sentinel = object() 

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

Jetzt können Anrufer eingestellt setLength bis None und es wird nicht als Standard angezeigt.

4

Aufgrund der Art und Weise Python-Bindings und Standardparameter Griffe ...

Der übliche Weg ist:

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

Und eine weitere Option:

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

Obwohl dies erfordert, dass Sie auf Verwenden Sie explizit perms(elements, setLength='something else'), wenn Sie keine Standardeinstellungen wünschen ...

4

Sie sollten so etwas wie tun:

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