Bitte ein komplettes Beispiel für die TypeError-Exeption

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
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Des Nachts der Code-Troll sich befleißt
Ein jedes Thema an sich reißt
Die Funktionen leuchten weit und hell
Allein es stört der Coding-Smell.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Strawk: ich habe noch etwas vergessen. True und False zählen auch als Integer. Das solltre man auch noch abfangen:

Code: Alles auswählen

a = True
if istype(a,bool):
    a = 3.5
a & 1
Und genauso geht dann natürlich auch:

Code: Alles auswählen

if not isinstance(l, list):
    3.5 & 1
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Alfons Mittelmeyer
True und False zählen auch als Integer
Du musst ein anderes Python benutzen als alle anderen hier im Forum. Du musst. Kann gar nicht anders. Und streite da am besten erst gar nicht ab, dass macht's nur schlimmer.

Gruß, noisefloor
BlackJack

@noisefloor: Nee, das stimmt schon:

Code: Alles auswählen

In [1]: isinstance(True, int)
Out[1]: True

In [2]: isinstance(False, int)
Out[2]: True

In [3]: issubclass(bool, int)
Out[3]: True

In [4]: True + True
Out[4]: 2

In [5]: 42 / False
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-5-5e0a6f844f47> in <module>()
----> 1 42 / False

ZeroDivisionError: integer division or modulo by zero

In [6]: -True
Out[6]: -1
Da Vererbung eine „ist-ein(e)“-Beziehung ist, braucht man das aber nicht extra testen, denn `bool`-Werte *sind* `int`-Werte, also ist es okay das auch `True` und `False` addiert werden können, denn es sind ja (auch) ganze Zahlen.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

aha, ok. Wieder was gelernt. Mein Gedankengang war, dass bool ein eigener Datentyp ist. Bis zum subclassing hatte ich nicht gedacht.

@Alfons Mittelmeyer: wir nutzen doch das gleiche Python, sorry.

Gruß, noisefloor
BlackJack

@noisefloor: Hat wohl historische Gründe. Am Anfang hatte Python keinen `bool`-Typ und viele haben sich deshalb `TRUE`/`True`/`true` und `FALSE`/`False`/`false` als Konstanten für 1 und 0 definiert, und das waren auch die Werte die von den Funktionen in der Standardbibliothek verwendet wurden. Und damit wurde wohl auch manchmal getrickst und in Ausdrücken gerechnet um sich ``if``\s zu sparen, wie man das von BASIC oder Forth kennt.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

noisefloor hat geschrieben:Mein Gedankengang war, dass bool ein eigener Datentyp ist
Immerhin sind True und False seit Python 3 Keywords. Mit Python 2 lässt sich noch so was machen:

Code: Alles auswählen

True = 5
Schön versteckt angewendet lassen sich damit missliebige Kollegen in den Wahnsinn treiben ... :wink:
BlackJack

@kbr: Das ist doch harmlos. ``True, False = False, True`` :twisted:
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@ BlackJack: Das ist zwar auch schön gemein, aber vermutlich schneller zu merken und leichter zu finden ... :wink:
BlackJack

@Strawk: Ich habe so eine `nested_sum()`-Funktion mit Typprüfung wie das von Lehrern/Dozenten dummerweise gern gesehen wird, übrigens gerade mal in PHP geschrieben. Wenn Du also PHP kannst, sollte das in Python kein grosses Problem sein, denn das sieht *sehr* ähnlich aus. Die Funktionen um den Typ zu prüfen heissen etwas anders, und in PHP heisst es ``throw`` statt ``raise``, aber davon und von den leichten syntaktischen Unterschieden abgesehen, kann man das nahezu 1:1 portieren.
BlackJack

In PHP würde so eine Funktion ungefähr so aussehen:
[codebox=php file=Unbenannt.php]function nested_sum(&$items)
{
if (is_array($items)) {
return array_reduce(
$items,
function ($total, $item) { return $total + nested_sum($item); },
0
);
} elseif (is_integer($items)) {
return $items;
} else {
throw new Exception('Unexpected type: ' . gettype($items));
}
}[/code]
Antworten