Seite 1 von 1

Fehler bei "from string import strip" und python3.

Verfasst: Donnerstag 12. März 2009, 15:01
von roby
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)

Verfasst: Donnerstag 12. März 2009, 15:10
von cofi
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()

Verfasst: Donnerstag 12. März 2009, 15:17
von helduel
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.

Verfasst: Donnerstag 12. März 2009, 15:36
von roby
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)); .

Verfasst: Donnerstag 12. März 2009, 15:41
von snafu
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']

Verfasst: Donnerstag 12. März 2009, 16:15
von helduel
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

Verfasst: Donnerstag 12. März 2009, 16:16
von roby
Jut das macht doch dann im prinzip das selbe wie map, danke snafu!

Re: Fehler bei "from string import strip" und pyth

Verfasst: Donnerstag 12. März 2009, 16:21
von DasIch

Re: Fehler bei "from string import strip" und pyth

Verfasst: Donnerstag 12. März 2009, 16:23
von helduel
DasIch hat geschrieben:lambda 8)
Wobei man lambda nicht unbedingt als elegant empfinden muss ;-).

Verfasst: Donnerstag 12. März 2009, 16:24
von DasIch
Kommt auf das Problem an. lambda ist aber prinzipiell eine geniale Sache,

Verfasst: Donnerstag 12. März 2009, 16:32
von snafu
DasIch hat geschrieben:lambda ist aber prinzipiell eine geniale Sache,
Im konkreten Fall aber IMHO nicht so geeignet.

Verfasst: Donnerstag 12. März 2009, 17:16
von Leonidas
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.

Verfasst: Donnerstag 12. März 2009, 17:22
von Trundle
Ich erwähne mal der Vollständigkeit halber `methodcaller()` aus dem [mod]operator[/mod]-Modul.

Verfasst: Donnerstag 12. März 2009, 17:31
von Leonidas
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(':')))

Verfasst: Freitag 13. März 2009, 07:54
von roby
Das ist ja schon ne ganze Menge, thx Leute!

Verfasst: Freitag 13. März 2009, 13:44
von derdon
@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.

Verfasst: Freitag 13. März 2009, 18:35
von Leonidas
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.