Seite 1 von 1

Beliebig viele Argumente übergeben

Verfasst: Dienstag 21. Mai 2013, 12:54
von cmate
Ich habe Probleme mit folgenden Code:

Code: Alles auswählen

def write_it(file, seperator, *args):
    seperator.join(args)
    print(seperator)
    file.write(seperator)
    
t = "auto","Fahrrad","laster"
f = open('/Users/lard/test.txt', 'w')
s = ":"

write_it(f, s, t)
Wenn ich das ausführe mit Python 3.3.2 ausführe, erhalte ich folgenden Fehler:

Code: Alles auswählen

TypeError: sequence item 0: expected str instance, tuple found
Das ist sicher ziemlich trivial, aber ich sitze trotzdem schon eine ganze Zeit davor und komme zu keiner Lösung.

Re: Beliebig viele Argumente übergeben

Verfasst: Dienstag 21. Mai 2013, 13:03
von BlackJack
@cmate: Du übergibst genau drei Argumente. Das dritte ist ein Tupel. Die einfachste Lösung wäre es die *-Magie einfach wegzulassen und nicht beliebig viele Argumente zu erwarten, sondern tatsächlich drei.

Re: Beliebig viele Argumente übergeben

Verfasst: Dienstag 21. Mai 2013, 13:04
von anogayales
Es gibt verschiedene Möglichkeiten wie du das Problem lösen kannst. Die einfachste wäre

Code: Alles auswählen

write_it(f, s, *t)
aufzurufen. Aber wie BlackJack bereits erwähnt hat: Lass einfach das *args weg und dann kannst du den Parameter ganz normal übergeben.

Grüße,
anogayales

Re: Beliebig viele Argumente übergeben

Verfasst: Dienstag 21. Mai 2013, 13:13
von JonasR
Es macht in deinem Fall auch null Sinn das zu machen oO

Re: Beliebig viele Argumente übergeben

Verfasst: Dienstag 21. Mai 2013, 13:36
von mcdwerner
@cmate: wenn man es sich von Anfang an falsch angelernt hat (so wie ich) ist es lange verwirrend:
Nicht die Klammer sondern das Komma macht das Tupel.

http://wiki.python.org/moin/TupleSyntax

Re: Beliebig viele Argumente übergeben

Verfasst: Dienstag 21. Mai 2013, 15:03
von cmate
Zunächst war dann also die Übergabe des Tupel an die Funktion verkehrt.
Um dem ganzen etwas mehr Sinn zu geben, habe ich die Funktion jetzt nochmal umgeschrieben.
Vorher hatte sie nur das Komma in test.txt geschrieben.

Code: Alles auswählen

def write_it(file, seperator, *args):
    file.write(seperator.join(args))
    
t = "auto","Fahrrad","laster",
f = open('/Users/lard/test.txt', 'w')
s = ','

write_it(f, s, *t)
Vielen Dank für Eure Hilfe!

Re: Beliebig viele Argumente übergeben

Verfasst: Dienstag 21. Mai 2013, 15:24
von BlackJack
@cmate: Das ist aber immer noch in sofern falsch, als das es unnötig kompliziert/magisch ist. Warum machst Du das so? Warum nicht einfach drei Argumente, wobei das dritte ein iterierbares Objekt ist. Für die *- und **-„Magie” in der Funktionssignatur sollte man einen guten Grund haben, und den sehe ich hier nicht.

Edit:

Code: Alles auswählen

#!/usr/bin/env python


def write_it(file_obj, seperator, strings):
    file_obj.write(seperator.join(strings))
    

def main():
    vehicles = ['Auto', 'Fahrrad', 'Laster']
    seperator = ','
    with open('/Users/lard/test.txt', 'w') as vehicle_file:
        write_it(vehicle_file, seperator, vehicles)


if __name__ == '__main__':
    main()

Re: Beliebig viele Argumente übergeben

Verfasst: Dienstag 21. Mai 2013, 15:30
von JonasR
Ohne die Sternchen sollte es genauso funktionieren