Code: Alles auswählen
if '#' in k:
k, idv = k.split("#", 2)
else:
idv = None
getridofmyphone
Code: Alles auswählen
if '#' in k:
k, idv = k.split("#", 2)
else:
idv = None
Code: Alles auswählen
>>> "a#b#c".split("#", 2)
['a', 'b', 'c']
>>> "a#b#c".split("#", 1)
['a', 'b#c']
Code: Alles auswählen
>>> "a#b#c".partition("#")
('a', '#', 'b#c')
>>> "a".partition("#")
('a', '', '')
Ah, danke. Den Fehler mache ich bestimmt noch einige Male, bevor ich mich an diesen Unterschied zu Perl gewöhnt habe.Zuerstmal ist dein code falsch - die Angabe des zweiten Parameters ist die Anzahl der gefundenen Trenner, nicht die Anzahl der erzeugten Segmente:
Code: Alles auswählen
def ext_split (string, sep, num, fill=None):
if num:
num -= 1
if not num:
return (string,)
head, sep, tail = string.partition(sep)
return (head,) + (
ext_split(tail, sep, num, fill)
if sep
else (fill,) * num
)
else:
return tuple()
print( ext_split( 'a#b#c', '#', 2 ) ) # ('a', 'b#c')
print( ext_split( 'a#b#c', '#', 3 ) ) # ('a', 'b', 'c')
print( ext_split( 'a#b#c', '#', 4 ) ) # ('a', 'b', 'c', None)
print( ext_split( 'a#b#c', '#', 5 ) ) # ('a', 'b', 'c', None, None)
Code: Alles auswählen
from itertools import cycle, islice, chain
def ext_split(s, sep, num, fill=None):
return list(islice(chain(s.split(sep, num - 1), cycle([fill])), 0, num))
Code: Alles auswählen
def ext_split(s, sep, num, fill=None):
if num < 0:
raise ValueError("`num` must be non-negative")
parts = s.split(sep, num - 1)
parts.extend([fill] * (num - len(parts)))
# alternativ:
# parts.extend(repeat(fill, num - len(parts)))
return parts
Code: Alles auswählen
def ext_split(s, sep, num, fill=None):
parts = s.split(sep, num - 1)
return chain(parts, repeat(fill, num - len(parts)))
Kommt darauf an, was man will. Manchmal muss man sich eben entscheiden, welche Exception im konkreten Problemkontext sprechender ist. "ValueError: not enough values to unpack" oder z.B. "TypeError: unsupported operand type(s) for +=: 'NoneType' and 'int'". Okay, man mag einwenden, dass man spätestens, wenn man sich die Frage nach der richtigeren Exception stellt, am besten gleich die richtigste aller Exceptions implementiert. Codequalität ist für mich aber auch, so zu programmieren, dass etwaige Fehlermeldunge, die man nicht erwartet, einen mit der Nase auf die Ursache stupsen.Außerdem finde ich es sehr unschön, fehlende Werte durch `None` zu ersetzen.