Seite 1 von 2
Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Montag 15. Mai 2017, 23:11
von kbr
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.
Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Dienstag 16. Mai 2017, 00:01
von Alfons Mittelmeyer
@Strawk: ich habe noch etwas vergessen. True und False zählen auch als Integer. Das solltre man auch noch abfangen:
Und genauso geht dann natürlich auch:
Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Dienstag 16. Mai 2017, 06:28
von noisefloor
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
Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Dienstag 16. Mai 2017, 10:07
von 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.
Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Dienstag 16. Mai 2017, 14:50
von noisefloor
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
Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Dienstag 16. Mai 2017, 15:10
von 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.
Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Dienstag 16. Mai 2017, 15:14
von kbr
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:
Schön versteckt angewendet lassen sich damit missliebige Kollegen in den Wahnsinn treiben ...

Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Dienstag 16. Mai 2017, 15:45
von BlackJack
@kbr: Das ist doch harmlos. ``True, False = False, True``

Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Dienstag 16. Mai 2017, 15:54
von kbr
@ BlackJack: Das ist zwar auch schön gemein, aber vermutlich schneller zu merken und leichter zu finden ...

Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Mittwoch 17. Mai 2017, 11:05
von 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.
Re: Bitte ein komplettes Beispiel für die TypeError-Exeption
Verfasst: Freitag 19. Mai 2017, 15:05
von 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]