Seite 1 von 1
Verhält sich replace() hier merkwürdig oder intuitiv?
Verfasst: Mittwoch 2. März 2011, 09:50
von snafu
Code: Alles auswählen
>>> s = 'Spam with ham and eggs'
>>> s.replace('a', 'X')
'SpXm with hXm Xnd eggs'
>>> s.replace('', 'X')
'XSXpXaXmX XwXiXtXhX XhXaXmX XaXnXdX XeXgXgXsX'
Es geht natürlich um die letzte Zeile. Hättet ihr dieses Ergebnis erwartet?
Hintergrund ist übrigens, dass ich gerade dabei bin, das Markieren von Completions via HTML-Tags in meinem kleinen Launchit-Projekt zu implementieren. Die Funktion habe ich folgendermaßen geschrieben:
Code: Alles auswählen
def get_marked_completion(completion, fragment, start_mark, end_mark):
if not fragment:
raise ValueError('fragment must be a non-empty string')
marked_fragment = start_mark + fragment + end_mark
return completion.replace(fragment, marked_fragment)
Ich mache den Test am Anfang halt, weil ich meine Ausgabe ansonsten recht ungewöhnlich fände, wollte aber gern mal eure Meinung in Bezug auf `replace()` hören.
Re: Verhält sich replace() hier merkwürdig oder intuitiv?
Verfasst: Mittwoch 2. März 2011, 10:47
von BlackJack
Ich hätte entweder das oder eine Ausnahme erwartet. Verhält sich auch konsistent mit den Testmethoden:
Code: Alles auswählen
In [139]: 'abc'.index('')
Out[139]: 0
In [140]: 'abc'.startswith('')
Out[140]: True
In [141]: '' in 'abc'
Out[141]: True
In [142]: re.findall('', 'abc')
Out[142]: ['', '', '', '']
Das sorgt zum Beispiel dafür, dass das hier funktioniert:
Code: Alles auswählen
if a in b:
d = b.replace(a, c)
assert a != c and b != d
Da wäre man ja schliesslich auch ein wenig überrascht wenn es ein `a` gäbe was zwar in `b` gefunden wird, dass man aber nicht ersetzen kann. Das spräche also gegen eine Ausnahme bei `replace()`. Und die Zusicherung sollte man IMHO auch erwarten dürfen -- was dagegen spräche, dass ein `replace()` mit a == '' einfach nichts machen würde.
Re: Verhält sich replace() hier merkwürdig oder intuitiv?
Verfasst: Freitag 4. März 2011, 08:01
von Zap
.. verhält sich auch konsistent zu string.count()
Code: Alles auswählen
In [4]: s
Out[4]: 'hallo'
In [5]: s.count("")
Out[5]: 6
.. string.split() hingegen schmeisst eine exception.
Code: Alles auswählen
In [6]: s.split("")
---------------------------------------------------------------------------
<type 'exceptions.ValueError'> Traceback (most recent call last)
H:\<ipython console> in <module>()
<type 'exceptions.ValueError'>: empty separator
Meine Erwartung wäre das gleiche Ergebnis wie list(s) gewesen.
Wenn mich jemand vorher gefragt hätte. Hätte ich passen müssen.