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

basestring <-> "basenumber" ?

Beitragvon jens » Freitag 24. November 2006, 13:28

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?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon BlackJack » Freitag 24. November 2006, 14:23

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

Beitragvon jens » Freitag 24. November 2006, 14:31

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

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

Beitragvon rayo » Freitag 24. November 2006, 14:47

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 24. November 2006, 15:03

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=] 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'>[/code]

Dennoch frage ich mich, warum das vergessen wurde?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon BlackJack » Freitag 24. November 2006, 16:19

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 24. November 2006, 16:35

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:

CMS in Python: http://www.pylucid.org
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

Beitragvon birkenfeld » Samstag 25. November 2006, 19:17

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder