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:

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

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:

Code: Alles auswählen

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

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`` :twisted:

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 ... :wink:

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]