Beliebig viele Argumente übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cmate
User
Beiträge: 7
Registriert: Samstag 25. Februar 2012, 21:28

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.
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.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Es macht in deinem Fall auch null Sinn das zu machen oO
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@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
cmate
User
Beiträge: 7
Registriert: Samstag 25. Februar 2012, 21:28

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!
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()
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Ohne die Sternchen sollte es genauso funktionieren
Antworten