basestring <-> "basenumber" ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Ich würde die Frage eher andersherum stellen: Warum gibt's das für Zeichenketten?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Verstehe ich jetzt nicht... Ich hab schon hin und wieder isinstance(obj, basestring) gemacht...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Py3k wird wahrscheinlich sowieso keinen "long"-Typ mehr haben.
Antworten