html parser

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.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Lach!

Ich habe das gerade nocheinmal installiert.
Diesmal hat es geklappt :shock:

Danke!
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ich bin etwas spät:
Das ist weder magisch, noch schlechter Stil.
raise verhält sich aktuell wie eine Funktion, die explizit auf einen Typ prüft und dann anders handelt als sonst, also Ducktyping ignoriert.

Code: Alles auswählen

def f(thing):
  if isinstance(thing, type) and issubclass(thing, Exception):
      thing = thing()
  
  # ...
Würde man auf solche Spezialfälle in normalen Python Funktionen durchgängig implementieren, wäre das schlechter Stil. Diese Funktion täte etwas, was von ihrer Aufgabe her nicht direkt ersichtlich ist, und tut es nur wenn man einen ganz bestimmten Typ als Argument übergäbe. Und zugleich hat man eine gewisse unnötige Inkonsequenz, denn ansonsten instanziiert man die Klasse ja sowieso. Warum also bei diesem speziellem Fall nicht auch? Warum kracht es nicht einfach, warum versucht raise auf diese Art und Weise das "falsche" Argument zurechtzubiegen?
Klar, mit solchen Exceptions macht man das nicht. Aber da geht auch ``raise MyError()`` nicht, so what?
Sowas ist ja auch ähnlich einzuordnen, wie wenn du deine Liste "list" nennst.
Ich erwarte (bei einer Funktion) normalerweise, das diese Funktion genau beschreibt, wie es mit seinen Argumenten umgeht und welche Verhaltensweisen diese unterstützen müssen. raise als Statement erwartet ein Exemplar einer Subklasse von Exception oder von Exception selbst. Übergebe ich einfach nur einen Namen, erwarte ich (bei Betrachten des Tracebacks zb), das dieser Name diese Verhaltensweisen unterstützt. Insofern wäre der einzige Hinweis darauf, das ich hier tatsächlich eine Klasse übergebe, die übliche Python Namenskonvention. Ohne diese (und das wissen, was raise genau tut) hätte ich nicht den geringsten Anhaltspunkt, was an der Stelle schief gelaufen wäre, weil eben durch einen Typcheck und einer aus der Reihe fallenden Behandlung versucht wurde, den "Fehler" bei Übergabe des Arguments zu korrigieren.
Ich würde es (im Falle Python 3) einfach ausprobieren...
Ich sagte ja nur, das ich mich selbst nicht darauf verlasse, das es so bleibt bzw es einfach klarer finde, auch hinter ein einzelnes "raise ValueError" noch ein Klammernpaar hinterzusetzen ;).


Das alles ist natürlich nicht so tragisch, wenn man einmal das Verhalten von raise kennt. Dennoch finde ich es allein schon wegem dem sonst üblichem Ducktyping besser, genau das zu übergeben, was auch erwartet wird.
Antworten