
Hai,
nachdem Rainer mich einigermaßen überzeugt hat, das man Ausnahmen wirklich nur in Ausnahmen nutzen sollte :), stellt sich mir jetzt die Frage, wie ich folgendes eigentlich einfache Problem auch einfach lösen kann:
Ich habe eine Funktion, der ich entweder einen einzelnen String oder eine Liste mit Strings übergeben möchte. Um anschliessend einheitlich mit einer Liste weiterarbeiten zu können, habe ich mir folgendes Konstrukt ausgedacht:
def myFunc(s): if isString(s): s = [s]
und isString sieht so aus:
def isString(s): try: s += ' ' except: return 0 else: return 1
Wie kann ich das auch ohne Exception lösen? Im Kochbuch wird auch folgende Variante angeboten:
def isString(s): return isinstance(s, type(''))
Das funktioniert aber erst ab Python 2.0 und auch nicht mit Unicode. Da es sich um ein Modul handelt, das ich veröffentlichen will, sollte es möglichst universell, am besten Version-1.5- kompatibel und kein Code-Monster sein (ich will's wenigstens selber noch verstehen).
Wobei sich mir auch gerade die Frage stellt, ob man beim Erstellen von Modulen noch auf die Version 1.5 Rücksicht nehmen sollte (und wie lange noch) oder eine andere Version (welche?) als allgemein vorrätig und benutzt vorraussetzen kann?
Lutz --- elektroelch.de -- free news for a free world
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Lutz Schröer wrote:
[...] def isString(s): try: s += ' ' except: return 0 else: return 1
Wie kann ich das auch ohne Exception lösen? Im Kochbuch wird auch folgende Variante angeboten:
def isString(s): return isinstance(s, type(''))
Das type('') ist wg. Kompatibilität mit antiken (< 2.2) Python-Versionen. Falls auch Unicode-Strings für dich Strings sind, ist mein Test ab Python 2.3:
isinstance(s, basestring)
und wenn 2.2 unterstützt werden soll:
isinstance(s, (str, unicode))
Aber wenn ich ehrlich sein soll, finde ich deinen Ansatz prinzipiell b0rken. Da es in Python keine Methodenüberladung anhand der Parametertypen gibt (wie heisst der Fachbegriff noch mal?), würde ich einfach *zwei* Methoden schreiben. Eine für einen String, eine für eine Liste.
Das funktioniert aber erst ab Python 2.0 und auch nicht mit Unicode. Da es sich um ein Modul handelt, das ich veröffentlichen will, sollte es möglichst universell, am besten Version-1.5- kompatibel und kein Code-Monster sein (ich will's wenigstens selber noch verstehen).
Unicode-Unterstützung und 1.5.2-Kompatibilität zusammen. Viel Spass.
Wobei sich mir auch gerade die Frage stellt, ob man beim Erstellen von Modulen noch auf die Version 1.5 Rücksicht nehmen sollte (und wie lange noch) oder eine andere Version (welche?) als allgemein vorrätig und benutzt vorraussetzen kann?
Wenn ich was als Open Source veröffentliche, mache ich dass weil mir die Entwicklung Spass macht. Und alles < 2.2 ist für mich kein Spass :-/ Und was mir nicht Spass macht, mache ich nur gegen Geld, denn das nennt sich dann Arbeit ;-)
Ich setzte bei meinem Zeug schon lange mindestens 2.1 voraus und in den nächsten Major-Releases meiner Datenbank-Module 2.2.
Ich leiste gern meinen Beitrag dazu, Leute zum Upgrade von Python zu bewegen :-D
-- Gerhard
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Wed, 17 Sep 2003 13:55:39 +0200 Schrieb "Lutz Schröer" latz@elektroelch.de:
Hai,
Hallo Lutz,
nachdem Rainer mich einigermaßen überzeugt hat, das man Ausnahmen wirklich nur in Ausnahmen nutzen sollte :), stellt sich mir jetzt die Frage, wie ich folgendes eigentlich einfache Problem auch einfach lösen kann:
Ich habe eine Funktion, der ich entweder einen einzelnen String oder eine Liste mit Strings übergeben möchte. Um anschliessend einheitlich mit einer Liste weiterarbeiten zu können, habe ich mir folgendes Konstrukt ausgedacht:
def myFunc(s): if isString(s): s = [s]
und isString sieht so aus:
def isString(s): try: s += ' ' except: return 0 else: return 1
Wie kann ich das auch ohne Exception lösen? Im Kochbuch wird auch folgende Variante angeboten:
def isString(s): return isinstance(s, type(''))
ich würde das so machen
def myFunc(s): if type(s) is not type([]): s = [s]
Das funktioniert aber erst ab Python 2.0 und auch nicht mit Unicode. Da es sich um ein Modul handelt, das ich veröffentlichen will, sollte es möglichst universell, am besten Version-1.5- kompatibel und kein Code-Monster sein (ich will's wenigstens selber noch verstehen).
geht auch mit 1.5 und Unicode ist auch kein problem
Wobei sich mir auch gerade die Frage stellt, ob man beim Erstellen von Modulen noch auf die Version 1.5 Rücksicht nehmen sollte (und wie lange noch) oder eine andere Version (welche?) als allgemein vorrätig und benutzt vorraussetzen kann?
ich denke mal 2.1 kann man heutzutage voraussetzen. Neue Projekte, just for fun, mache ich auch nur noch für 2.3
Gruß
Fritz
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Lutz Schröer wrote:
nachdem Rainer mich einigermaßen überzeugt hat, das man Ausnahmen wirklich nur in Ausnahmen nutzen sollte
Man sollte da nicht in Dogmatismus verfallen. In der Praxis hat es sich (auch aus Performance-Gruenden) bewaehrt, sich in diejenigen Faellen auf Exceptions zu verlassen, welche "relativ selten" auftreten. Wenn ein einfacher Vergleich als Ersatz ausreicht (oder sogar eine einfache Berechnung), dann ist deren Einsatz aber haeufig wirklich naheliegender.
Im Kochbuch wird auch folgende Variante angeboten:
def isString(s): return isinstance(s, type(''))
Das funktioniert aber erst ab Python 2.0 und auch nicht mit Unicode.
Das funktioniert problemlos auch mit Python 1.5, aber in der Tat nicht mit Unicode. Wenn du Versionsunabhaengigkeit *und* Unicode willst, dann koennte folgendes helfen:
import types
if hasattr(types, 'UnicodeType'): _stypes = (types.StringType, types.UnicodeType) else: _stypes = (types.StringType,)
if not hasattr(__builtins__, 'True'): True = 1 False = 0
def isString(s): for t in _stypes: if isinstance(s, t): return True return False
Die for-Schlaufe ist notwendig, weil isinstance() in 1.5 noch nicht mit Listen/Tupeln umgehen kann, die musst du also selber behandeln.
Ich behaupte nicht, dass dies das Maximum an Eleganz ist, aber das sind Kompatibilitaetsloesungen selten. Immerhin sollte es fuer (fast ;) jeden Python-Entwickler verstaendlich sein.
-schorsch
participants (4)
-
Fritz Cizmarov
-
Georg Mischler
-
Gerhard Häring
-
Lutz Schröer