Seite 1 von 1

basestring <-> "basenumber" ?

Verfasst: Freitag 24. November 2006, 13:28
von jens
Es gibt ja basestring:
basestring()
This abstract type is the superclass for str and unicode. It cannot be called or instantiated, but it can be used to test whether an object is an instance of str or unicode. isinstance(obj, basestring) is equivalent to isinstance(obj, (str, unicode)). New in version 2.3.
http://docs.python.org/lib/built-in-funcs.html#l2h-11

Es gibt aber kein gegenstück für Zahlen. Also ob objekt vom typ int, long etc. ist...

Warum?

Verfasst: Freitag 24. November 2006, 14:23
von BlackJack
Ich würde die Frage eher andersherum stellen: Warum gibt's das für Zeichenketten?

Verfasst: Freitag 24. November 2006, 14:31
von jens
Verstehe ich jetzt nicht... Ich hab schon hin und wieder isinstance(obj, basestring) gemacht...

Verfasst: Freitag 24. November 2006, 14:47
von rayo
Da steht ja "is equivalent to isinstance(obj, (str, unicode))".
Also würd ich jetzt für Zahlen einfach isinstance(obj, (int, long)) machen.

Gruss

Verfasst: Freitag 24. November 2006, 15:03
von jens
Jo, auf die Idee bin ich depp nicht gekommen... Aber klar gehts so:

Code: Alles auswählen

test = [124, 293.82, 28L, "blub"]

for obj in test:
    print "%6s - %-5s - %s" % (
        obj, isinstance(obj, (int, long, float)), type(obj)
    )

print "-"*79
basenumber = (int, long, float)

for obj in test:
    print "%6s - %-5s - %s" % (
        obj, isinstance(obj, basenumber), type(obj)
    )
Ausgabe:

Code: Alles auswählen

   124 - True  - <type 'int'>
293.82 - True  - <type 'float'>
    28 - True  - <type 'long'>
  blub - False - <type 'str'>
-------------------------------------------------------------------------------
   124 - True  - <type 'int'>
293.82 - True  - <type 'float'>
    28 - True  - <type 'long'>
  blub - False - <type 'str'>
Dennoch frage ich mich, warum das vergessen wurde?

Verfasst: Freitag 24. November 2006, 16:19
von BlackJack
Warum vergessen? Wie gesagt: Ich frage mich warum es `basestring` gibt. Wozu braucht man das? Um nicht ``(str, unicode)`` schreiben zu müssen? Das fänd' ich ein ziemlich schwaches Argument um einen Namen im `builtin`-Namensraum zu belegen.

Wenn Du jetzt `basenumber` haben willst, dann kommt der nächste und möchte `basesequence` für Zeichenketten, Listen und Tupel. Und `Decimal` gehört auch irgendwie unter `basenumber`. Und vielleicht sollte man dann noch einen Zwischenschritt `fractional_number` für `Decimal` und `float` einfügen. Und... zack hat man so'ne schöne Klassenhierarchie wie in Java und es wird noch schwerer Umsteigern duck typing näher zu bringen.

Wenn Du auf `basenumber` prüfst, schliesst Du `Decimal` aus? Zu recht?

Verfasst: Freitag 24. November 2006, 16:35
von jens
Ja, das sind schon einige Argumente, da hast du recht...

Wie geschrieben hatte ich letztens das Problem und dachte mir, zu basestring muß es auch ein Gegenstück für Zahlen geben. Gesucht und nix gefunden ;)

Lassen wir es dabei... Ich hab das im Nachhinein eh anders gelöst :wink:

Verfasst: Samstag 25. November 2006, 19:17
von birkenfeld
Py3k wird wahrscheinlich sowieso keinen "long"-Typ mehr haben.