Fehler bei "from string import strip" und python3.

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
roby
User
Beiträge: 7
Registriert: Freitag 6. März 2009, 14:59

Hallo,
ich hab auf meinem Mac python 2.5.1 und python 3.0.1. Wenn ich folgenden Beispielcode mit python 2.5 ausfuehre, gibt es keinen Fehler. Starte ich das Skript hingegen mit python3.0 erhalte ich einen ImportError: cannot import strip.
Hab schon in der Documentation und im Changelog von python 3 gesucht aber nix gefunden. Hoffe ihr koennt mir weiter helfen.
Gruß roby

Code: Alles auswählen

from string import strip

line = "   abc   :  def   "
s = map(strip, line.split(':', 1))
print(s)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

http://docs.python.org/3.0/library/string.html

Da solltest du das durchaus finden - oder besser gesagt nicht, da es herausgeflogen ist ;) .
`strip' aus `string' brauchst du aber nicht. Das ist schon lange eine string-methode, d.h. du kannst es direkt auf strings anwenden:

Code: Alles auswählen

teststr = "test!   "
print teststr.strip()
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Diese Funktionen erscheinen in er 2.x-Doku auch unter deprecated. Sie sind zwar noch da (in der 2er-Serie), aber benutzen sollte man sie trotzdem nicht mehr.
roby
User
Beiträge: 7
Registriert: Freitag 6. März 2009, 14:59

Ok soweit hab ich das auch gesehen, aber ich hab nach ner Stelle gesucht wo konkret steht das es rausgeflogen ist und was man als Alternative im Zusammenhang mit map verwenden kann. Ok ich koennte auch in ner Schleife das strip() auf jedes Element in der Liste anwenden finde das aber nicht so elegant wie s = map(strip, line.split(':', 1)); .
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man könnte auch (sollte vielleicht sogar?) hier List Comprehension nutzen. Dann musst du auch nichts importieren.

Code: Alles auswählen

In [7]: [elem.strip() for elem in line.split(':', 1)]
Out[7]: ['abc', 'def']
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

roby hat geschrieben:Ok soweit hab ich das auch gesehen, aber ich hab nach ner Stelle gesucht wo konkret steht das es rausgeflogen ist und was man als Alternative im Zusammenhang mit map verwenden kann.
http://docs.python.org/library/string.h ... -functions
http://www.python.org/dev/peps/pep-0202/
Ok ich koennte auch in ner Schleife das strip() auf jedes Element in der Liste anwenden finde das aber nicht so elegant wie s = map(strip, line.split(':', 1)); .
Du könntest sowas machen:

Code: Alles auswählen

s = map(str.strip, line.split(':', 1))
Das funktioniert aber mit Unicode so nicht. Da müsstest du dann unicode.strip nehmen. Besser ist also eine List Comprehension, wie snafu gezeigt hat.

Gruß,
Manuel
roby
User
Beiträge: 7
Registriert: Freitag 6. März 2009, 14:59

Jut das macht doch dann im prinzip das selbe wie map, danke snafu!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

DasIch hat geschrieben:lambda 8)
Wobei man lambda nicht unbedingt als elegant empfinden muss ;-).
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Kommt auf das Problem an. lambda ist aber prinzipiell eine geniale Sache,
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

DasIch hat geschrieben:lambda ist aber prinzipiell eine geniale Sache,
Im konkreten Fall aber IMHO nicht so geeignet.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

DasIch hat geschrieben:lambda ist aber prinzipiell eine geniale Sache,
Prinzipiell ja, in Python aber eher weniger. Dort versuche ich so gut wie möglich ``lambda`` zu vermeiden und verwende lieber Factory-Funktionen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Ich erwähne mal der Vollständigkeit halber `methodcaller()` aus dem [mod]operator[/mod]-Modul.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Yay! :D

Code: Alles auswählen

from itertools import imap
from operator import methodcaller
print list(imap(methodcaller('strip'), ' Das : ist : kein : IRC-String'.split(':')))
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
roby
User
Beiträge: 7
Registriert: Freitag 6. März 2009, 14:59

Das ist ja schon ne ganze Menge, thx Leute!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

@Leonidas: Warum erzeugst du zuerst mit imap einen Generator, den du mit list anschließend in eine Liste umwandelst? map alleine würde doch reichen. Dann hast du einen Funktionsaufruf weniger und das gleiche Ergebnis.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

derdon hat geschrieben:@Leonidas: Warum erzeugst du zuerst mit imap einen Generator, den du mit list anschließend in eine Liste umwandelst? map alleine würde doch reichen. Dann hast du einen Funktionsaufruf weniger und das gleiche Ergebnis.
Weil ``list()`` nur da ist, um den Generator anzuzeigen. In "echtem" Code würde ich da kein ``list()`` machen sondern den Generator so wie er ist stehenlassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten