Wenn ich ein Tupel "dekonstruiere", kann ich damit _
Tupelelemente bezeichnen, an denen ich nicht interessiert bin, z
>>> a,_,_ = (1,2,3)
>>> a
1
Wie kann ich mit Python 2.x dasselbe mit Funktionsargumenten ausdrücken? Ich habe versucht, Unterstriche zu verwenden:
>>> def f(a,_,_): return a
...
File "<stdin>", line 1
SyntaxError: duplicate argument '_' in function definition
Ich habe auch versucht, das Argument ganz wegzulassen:
>>> def f(a,,): return a
File "<stdin>", line 1
def f(a,,): return a
^
SyntaxError: invalid syntax
Gibt es einen anderen Weg, um dasselbe zu erreichen?
python
python-2.x
Frerich Raabe
quelle
quelle
del
(ich mag es auch nicht selbst), ich habe mich dagegen ausgesprochen, den Argumenten plausible Namen zu geben, aber sie dann einfach nicht zu verwenden, da Tools und Kollegen dies wahrscheinlich tun werden heben Sie ihre (elektronischen) Augenbrauen darüber. Natürlich kann ich meine Absichten immer als englischen Text dokumentieren, aber ich würde etwas bevorzugen, das es in Python ausdrückt.Antworten:
Folgendes mache ich mit unbenutzten Argumenten:
def f(a, *unused): return a
quelle
f(a,b,c,d)
. Es scheint die Argumente nicht explizit zu benennen - würde die Verwendungkwargs
auf meiner Seite in diesem Fall helfen? Vielleicht ist das Framework nicht optimal, aber was soll ich sagen - ich muss das verwenden, was mir gegeben wurde. : -}Eine lustige Art, an die ich gerade gedacht habe, ist das Löschen der Variablen:
def f(foo, unused1, unused2, unused3): del unused1, unused2, unused3 return foo
Dies hat zahlreiche Vorteile:
del
ist die im PyLint-Handbuch empfohlene Lösung .quelle
# Ignored parameters.
da die Absicht nicht wirklich darin besteht, die Variablen zu "löschen".del
selbst kümmert sich darum, das Argument "freizugeben" (so dass es für die Speicherbereinigung in Frage kommt, wenn nichts anderes darauf verweist). Der einzige andere Aufwand besteht darin, dass das Argument selbst übergeben wird. Dies sollte vernachlässigbar sein, kann jedoch nicht ohne Analyse des gesamten Programms optimiert werden. 1) Finden und Ändern jedes Aufrufers, um diese Argumente nicht zu übergeben. 2) Sicherstellen, dass diese optimierten Aufrufer keine Funktionen aufrufen , das kann noch diese Argumente in dieser optimierten Art und Weise verwenden, und 3) zu beweisen , dass keine andere Aufrufer der Funktion vorhanden ist . (Fortsetzung)Der Unterstrich wird für Dinge verwendet, die uns nicht interessieren, und die * in * -Argumente bezeichnen eine Liste von Argumenten. Daher können wir * _ verwenden, um eine Liste von Dingen zu kennzeichnen, die uns nicht interessieren:
def foo(bar, *_): return bar
Es besteht sogar die Schecks von PyCharm.
quelle
_name
like_rubbish
für Wegwerfparameter aus drei Gründen: a) Pycharm zeigt die Warnung nicht mehr an. b) Ich erinnere mich, was ich wegwerfe. c) Es besteht kein Konflikt mit einem einzelnen Unterstrich.ignored-argument-names=_.*
Muster übereinstimmen , dürfen nicht verwendet werden_arg
ist Konvention auch bedeuten , die verwendet „optional private arg, nicht passieren , wenn Sie wissen , was du tust“.Sie können '_' als Präfix verwenden, damit pylint diese Parameter ignoriert:
def f(a, _b, _c):
quelle
Wenn Sie sowohl Argumente als auch Schlüsselwörter haben, sollten Sie diese verwenden
def f(a, *args, **kwargs): return a
quelle
*args, **kwargs
Funktionen zu akzeptieren, bei denen Sie sie möglicherweise nicht verwenden oder sich nicht darum kümmernIch denke, die akzeptierte Antwort ist schlecht, aber es kann immer noch funktionieren, wenn Sie das verwenden, was ich als "Perl-Methode" für den Umgang mit Argumenten bezeichnen sollte (ich kenne Perl nicht wirklich, aber ich höre auf, es zu lernen, nachdem ich die
sub
Syntax gesehen habe). mit manuellem Argument entpacken):Ihre Funktion hat 3 Argumente - so wird sie aufgerufen (Duck tippen, erinnerst du dich?). So bekommen Sie:
def funfun(a, b, c): return b * 2
2 nicht verwendete Parameter. Aber jetzt geben Sie einen verbesserten Larsmans-Ansatz ein:
def funfun(*args): return args[1] * 2
Und da gehen die Warnungen ...
Trotzdem genieße ich den Weg der Box immer noch mehr:
def funfun(a, b, c): del a, c return b * 2
Die selbstdokumentierende Qualität der Parameternamen bleibt erhalten. Sie sind eine Funktion, kein Fehler.
Aber die Sprache selbst zwingt Sie nicht dorthin - Sie könnten auch umgekehrt vorgehen und einfach alle Ihre Funktionen mit der Signatur versehen
(*args, **kwargs)
und das Argument jedes Mal manuell analysieren. Stellen Sie sich vor, wie viel Kontrolle Sie haben. Und keine Ausnahmen mehr, wenn Sie nach dem Ändern Ihrer "Signatur" (Anzahl und Bedeutung der Argumente) veraltet aufgerufen werden. Das ist eine Überlegung wert;)quelle
# unused
Kommentar geschrieben haben, ist ein Hinweis darauf, dass es nicht so selbstdokumentierend oder idiomatisch ist, ihn so zu verwendendel
.del
tut. Oder denken Sie, dass dunkler Code weniger dunkel wird, wenn Sie Kommentare daraus entfernen?def(..)
Strich liegt - Kommentare oder nicht - ist nicht relevant.Um "unbenutzte Variablen" -Inspektionsnachrichten für nicht verwendete * Argumente und / oder ** kwargs zu vermeiden, ersetze ich
args
undkwargs
durch_
und__
:def f(a, b, *_, **__): ...
Neben dem Entfernen von Nachrichten wird deutlich, dass Sie sich nicht für diese Argumente interessieren.
Ich kann nicht sagen, ob es eine wirklich universelle Lösung ist, aber sie hat überall funktioniert, wo ich sie bisher verwendet habe.
quelle