Gibt es in Python eine Möglichkeit, optionale Parameter während des Aufrufs an eine Funktion zu übergeben und in der Funktionsdefinition einen Code zu haben, der auf "nur wenn der optionale Parameter übergeben wird" basiert?
Die Python 2-Dokumentation, 7.6. Mit Funktionsdefinitionen können Sie auf verschiedene Weise feststellen, ob ein Aufrufer einen optionalen Parameter angegeben hat.
Erstens können Sie eine spezielle formale Parametersyntax verwenden *
. Wenn der Funktionsdefinition ein formaler Parameter vorangestellt ist *
, füllt Python diesen Parameter mit Positionsparametern, die nicht mit vorhergehenden formalen Parametern übereinstimmen (als Tupel). Wenn der Funktionsdefinition ein formaler Parameter vorangestellt ist **
, füllt Python diesen Parameter mit Schlüsselwortparametern, die nicht mit vorhergehenden formalen Parametern übereinstimmen (als Diktat). Die Implementierung der Funktion kann den Inhalt dieser Parameter auf beliebige "optionale Parameter" der gewünschten Sortierung überprüfen.
Hier ist zum Beispiel eine Funktion, opt_fun
die zwei Positionsparameter x1
und verwendet x2
und nach einem anderen Schlüsselwortparameter mit dem Namen "optional" sucht.
>>> def opt_fun(x1, x2, *positional_parameters, **keyword_parameters):
... if ('optional' in keyword_parameters):
... print 'optional parameter found, it is ', keyword_parameters['optional']
... else:
... print 'no optional parameter, sorry'
...
>>> opt_fun(1, 2)
no optional parameter, sorry
>>> opt_fun(1,2, optional="yes")
optional parameter found, it is yes
>>> opt_fun(1,2, another="yes")
no optional parameter, sorry
Zweitens können Sie einen Standardparameterwert mit einem Wert angeben, None
den ein Aufrufer niemals verwenden würde. Wenn der Parameter diesen Standardwert hat, wissen Sie, dass der Aufrufer den Parameter nicht angegeben hat. Wenn der Parameter einen nicht standardmäßigen Wert hat, wissen Sie, dass er vom Aufrufer stammt.
positional_parameters
ist ein Tupel undkeyword_parameters
ein Wörterbuch.formal parameters preceded by *
(wie heißt das?) Von akeyword parameter
? Nach meinem Verständnis werden Schlüsselwortparameter mithilfe des=
Operators im Funktionsaufruf angegeben (daheropt_fun(1,2, optional="yes")
wird ein Schlüsselwortargument "yes" für eine Funktion bereitgestellt , die den Parameter antizipiert, aber nicht unbedingt benötigtoption
).formal parameters preceded by *
einfach "die vom Aufrufer bereitgestellten Argumente, die nicht den Positionsargumenten entsprechen, die vor Schlüsselwortargumenten stehen". Zum Beispiel inopt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018")
,"blah"
und3.14
sind ,forma arguments preceded by *
weil es zwischen den beiden Positionsargumenten ist und das Argument, das verwendeten=
Zeichen. Das resultierende Tupelpositional_parameter
wäre das Dupel :("blah", 3.14)
. Ist das richtig?parameter
" nicht "parameters
" für "preceded by *
" geschrieben habe. Die Sprache erlaubt nur einen*identifier
in der Parameterliste. b) Lesen Sie docs.python.org/2/reference/… , c) Lesen Sie docs.python.org/2/reference/expressions.html#calls . In diesem Kommentar sind leider keine Zeichen mehr zulässig.http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
Ich finde das lesbarer als zu benutzen
**kwargs
.Um festzustellen, ob überhaupt ein Argument übergeben wurde, verwende ich ein benutzerdefiniertes Dienstprogrammobjekt als Standardwert:
quelle
default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
quelle
op(b=2)
Wenn Sie einem Parameter einen Standardwert geben möchten, weisen Sie in () einen Wert zu. wie (x = 10). Wichtig ist jedoch zuerst das obligatorische Argument und dann der Standardwert.
z.B.
(y, x = 10)
aber
(x = 10, y) ist falsch
quelle
*arg
**karg
wie Funktionsargumente verwenden. googeln.Sie können einen Standardwert für das optionale Argument mit etwas angeben, das niemals an die Funktion übergeben würde, und ihn mit dem
is
Operator überprüfen :Solange Sie dies nicht tun
func(_NO_DEFAULT)
, können Sie genau feststellen, ob das Argument übergeben wurde oder nicht, und im Gegensatz zur akzeptierten Antwort müssen Sie sich keine Gedanken über die Nebenwirkungen der ** Notation machen:quelle
_NO_DEFAULT = object()
.help(func)
Sie eine klarere Vorstellung davon, wie das Argument interpretiert wird, wenn es nicht explizit übergeben wird.