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.
Bitte ein komplettes Beispiel für die TypeError-Exeption
-
- 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:
Und genauso geht dann natürlich auch:
Code: Alles auswählen
a = True
if istype(a,bool):
a = 3.5
a & 1
Code: Alles auswählen
if not isinstance(l, list):
3.5 & 1
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@Alfons Mittelmeyer
Gruß, noisefloor
@Alfons Mittelmeyer
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.True und False zählen auch als Integer
Gruß, noisefloor
@noisefloor: Nee, das stimmt schon:
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.
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
- noisefloor
- User
- Beiträge: 3856
- 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
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
@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.
Immerhin sind True und False seit Python 3 Keywords. Mit Python 2 lässt sich noch so was machen:noisefloor hat geschrieben:Mein Gedankengang war, dass bool ein eigener Datentyp ist
Code: Alles auswählen
True = 5
@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.
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]
[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]