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.

7voto

Jochen Ritzel Punkte 99416

Wenn another_func will nur eine Iterable, die man übergeben kann itertools.chain(x,'a') dazu.

4voto

fabrizioM Punkte 43906

Wie wäre es, die andere Funktion so zu ändern, dass sie stattdessen eine Liste von Parametern akzeptiert?

def func(arg): # arg is tuple or list
  another_func('a', *x)

3voto

Sean Punkte 4045

Wie wäre es damit:

l = ['a']
l.extend(x)

Bearbeiten: Wenn ich mir die Frage noch einmal durchlese, denke ich, dass dies eher das ist, was Sie wollen (die Verwendung von arg y x war ein wenig verwirrend):

tuple(arg) + ('a',)

Wie bereits gesagt wurde, ist dies wahrscheinlich nicht die effizienteste Methode, aber sie ist sehr klar. Wenn Ihre Tupel/Listen klein sind, würde ich dies einer weniger klaren Lösung vorziehen, da der Leistungsverlust vernachlässigbar ist. Wenn Ihre Listen groß sind, verwenden Sie die effizienteren Lösungen.

2voto

pyfunc Punkte 63257
def f(*args):
    print args

def a(*args):
    k = list(args)
    k.append('a')
    f(*k)

a(1, 2, 3)

Ausgabe:

(1, 2, 3, 'a')

2voto

Bakuriu Punkte 91990

Wenn eine Iterable ausreicht, können Sie mit itertools.chain aber beachten Sie, dass die Funktion A (der erste, der aufgerufen wird), iteriert ebenfalls über die Iterable nach dem Aufruf von B dann könnten Sie Probleme bekommen, da Iterables nicht zurückgespult werden können. In diesem Fall sollten Sie sich für eine Sequenz entscheiden oder die iterable.tee um eine Kopie der Iterablen zu erstellen:

import itertools as it

def A(iterable):
    iterable, backup = it.tee(iterable)
    res = B(it.chain(iterable, 'a'))
    #do something with res
    for elem in backup:
        #do something with elem

def B(iterable):
   for elem in iterable:
       #do something with elem

Auch wenn itertools.tee nicht wirklich effizient ist, wenn B verbraucht todo o Die meisten der Iterable, dann ist es einfacher, einfach die iterable zu einer tuple oder eine list .

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