Alternative zu rpartition

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Alternative zu rpartition

Johannes Markert
Hallo liebe Python-Gemeinde,

ich bin aus unbeeinflussbaren Gründen auf Python 2.4 angewiesen.
Und da ist die String-Operation rpartition() noch nich implementiert.
Welche Alternativen gibt es für diese ältere Version?

Gruß,
Johannes

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: Alternative zu rpartition

Ulf Rompe-5
Am 13.08.2010 13:08, schrieb Johannes Markert:
> ich bin aus unbeeinflussbaren Gründen auf Python 2.4 angewiesen.
> Und da ist die String-Operation rpartition() noch nich implementiert.
> Welche Alternativen gibt es für diese ältere Version?

str.rsplit(sep, 1) sollte in etwa tun, was Du brauchst.

--
[x] u1f



_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: Alternative zu rpartition

Stefan Schwarzer-2
In reply to this post by Johannes Markert
Hallo Johannes,

On 2010-08-13 13:08, Johannes Markert wrote:
> ich bin aus unbeeinflussbaren Gründen auf Python 2.4 angewiesen.
> Und da ist die String-Operation rpartition() noch nich implementiert.
> Welche Alternativen gibt es für diese ältere Version?

auf die Schnelle habe ich keinen Ersatz für Python 2.4
gefunden, daher hier eine Implementierung als Funktion, die
sich wie `rpartition` verhalten sollte. Das Schwierigste war,
die richtigen Rückgabetypen für die Strings sicherzustellen.

Ich garantiere nicht für Fehlerfreiheit! :)

def rpartition(s, sep):
    """Implementation of `rpartition` as a function for Python < 2.5.

    See http://docs.python.org/library/stdtypes.html#str.rpartition .

    Warning: Not thoroughly tested.
    """
    parts = s.split(sep)
    # If one of the arguments is a unicode string, returned strings
    # need to be unicode strings as well. `string_type(...)` may
    # raise a `UnicodeDecodeError`, which results in the same behavior
    # as that of `str.rpartition`/`unicode.rpartition`.
    string_type = type(parts[0])
    if len(parts) == 1:
        # Separator not found.
        empty_string = string_type("")
        return (empty_string,
                empty_string,
                string_type(s))
    else:
        return (string_type(sep).join(parts[:-1]),
                string_type(sep),
                string_type(parts[-1]))

Viele Grüße
Stefan

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: Alternative zu rpartition

Stefan Schwarzer-2
On 2010-08-13 15:29, Stefan Schwarzer wrote:

> def rpartition(s, sep):
>     """Implementation of `rpartition` as a function for Python < 2.5.
>
>     See http://docs.python.org/library/stdtypes.html#str.rpartition .
>
>     Warning: Not thoroughly tested.
>     """
>     parts = s.split(sep)
>     # If one of the arguments is a unicode string, returned strings
>     # need to be unicode strings as well. `string_type(...)` may
>     # raise a `UnicodeDecodeError`, which results in the same behavior
>     # as that of `str.rpartition`/`unicode.rpartition`.
>     string_type = type(parts[0])
>     if len(parts) == 1:
>         # Separator not found.
>         empty_string = string_type("")
>         return (empty_string,
>                 empty_string,
>                 string_type(s))
>     else:
>         return (string_type(sep).join(parts[:-1]),
>                 string_type(sep),
>                 string_type(parts[-1]))

Es geht wohl etwas kompakter (aber die ursprüngliche Version ist
meines Erachtens klarer):

def rpartition(s, sep):
    """Implementation of `rpartition` as a function for Python < 2.5.

    See http://docs.python.org/library/stdtypes.html#str.rpartition .

    Warning: Not thoroughly tested.
    """
    parts = s.split(sep)
    # If one of the arguments is a unicode string, returned strings
    # are also unicode strings. `string_type(sep)` may raise a
    # `UnicodeDecodeError`, which is the same behavior as that of
    # `str.rpartition`.
    string_type = type(parts[0])
    if len(parts) == 1:
        # Separator not found.
        returned_sep = string_type("")
    else:
        returned_sep = string_type(sep)
    return (string_type(sep).join(parts[:-1]),
            returned_sep,
            string_type(parts[-1]))

Falls du Unittests schreiben willst, denk daran, dass `assertEqual`
nicht zwischen Byte-Strings und Unicode-Strings unterscheidet.

Viele Grüße
Stefan

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: Alternative zu rpartition

Diez B. Roggisch
In reply to this post by Johannes Markert

Am 13.08.2010 um 13:08 schrieb Johannes Markert:

> Hallo liebe Python-Gemeinde,
>
> ich bin aus unbeeinflussbaren Gründen auf Python 2.4 angewiesen.
> Und da ist die String-Operation rpartition() noch nich implementiert.
> Welche Alternativen gibt es für diese ältere Version?

Naja, das ist doch schnell selbst geschrieben:

def rpartition(s, sep):
     try:
         left, right = s.rsplit(sep, 1)
         return left, sep, right
     except ValueError:
         return '', '', s


assert ('www.python', '.', 'org') == rpartition('www.python.org', '.')
assert ('', '', 'www.python.org') == rpartition('www.python.org', ':')


_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de
Reply | Threaded
Open this post in threaded view
|

Re: Alternative zu rpartition

Stefan Schwarzer-2
Hallo,

On 2010-08-13 16:12, Diez B. Roggisch wrote:
> Am 13.08.2010 um 13:08 schrieb Johannes Markert:
>> ich bin aus unbeeinflussbaren Gründen auf Python 2.4 angewiesen.
>> Und da ist die String-Operation rpartition() noch nich implementiert.
>> Welche Alternativen gibt es für diese ältere Version?
>
> Naja, das ist doch schnell selbst geschrieben:
> [...]

das kommt darauf an, wie genau man das Verhalten bzgl.
Byte-Strings und Unicode-Strings (ggf. gemischt) nachbilden
will. ;-)

Falls man nur mit Unicode-Strings arbeitet, was meist zu
empfehlen ist, sollte die einfachere Variante reichen, in
der man '' durch u'' ersetzt.

Viele Grüße
Stefan

_______________________________________________
python-de maillist  -  [hidden email]
http://python.net/mailman/listinfo/python-de