6 Stimmen

Python-Funktionsparameter: Tupel/Liste

Meine Funktion erwartet eine Liste oder ein Tupel als Parameter. Es ist egal, was es ist, es wird lediglich an eine andere Funktion übergeben, die entweder eine Liste oder ein Tupel akzeptiert:

def func(arg): # arg is tuple or list
  another_func(x)
  # do other stuff here

Jetzt muss ich die Funktion leicht abändern, um ein zusätzliches Element zu verarbeiten:

def func(arg): #arg is tuple or list
  another_func(x + ['a'])
  # etc

Leider wird das nicht funktionieren: Wenn arg ein Tupel ist, muss ich sagen x + ('a',) .

Natürlich kann ich es hinbekommen, indem ich arg zur Liste zwinge. Aber es ist nicht ordentlich.

Gibt es einen besseren Weg, dies zu tun? Ich kann die Aufrufer natürlich nicht zwingen, immer ein Tupel zu übergeben, da es einfach die Arbeit auf sie verlagert.

1voto

slezica Punkte 69362

Mein Vorschlag:

def foo(t):
    bar(list(t) + [other])

Das ist allerdings nicht sehr effizient. Es wäre besser, veränderbare Dinge weiterzugeben, wenn man sie, nun ja, verändern will.

1voto

martineau Punkte 110783

Sie können den Typ der an die erste Funktion übergebenen Iterable verwenden, um zu konstruieren, was Sie an die zweite Funktion übergeben:

from itertools import chain

def func(iterable):
    it = iter(iterable)
    another_func(type(iterable)(chain(it, ('a',))))

def another_func(arg):
    print arg

func((1,2))
# (1, 2, 'a')
func([1,2])
# [1, 2, 'a']

0voto

Steven Rumbalski Punkte 42089

Lassen Sie Ihre Funktion eine beliebige Iterable akzeptieren. Dann verwenden Sie itertools.chain um der Iterable eine beliebige Sequenz hinzuzufügen.

from itertools import chain

def func(iterable):
    another_func(chain(iterable, ('a',)))

0voto

JanKanis Punkte 5686

Ich würde sagen, Santiago Lezicas Antwort, die

def foo(t):
    bar(list(t) + [other])

ist die beste, weil sie die einfachste ist. (keine Notwendigkeit, itertools Zeug zu importieren und viel weniger lesbare Kettenaufrufe zu verwenden). Aber verwenden Sie es nur, wenn Sie erwarten, dass t klein ist. Wenn t groß sein kann, sollten Sie eine der anderen Lösungen verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X