[python-users] Etwas Hilfe zur Still, Code-Übersichtlichkeit und Verbesserungen

Johannes Ammon j.ammon at dr-ammon.de
Mo Mär 14 14:51:25 CET 2011


Am 14.03.2011 um 14:20 schrieb Daniel Hepper:
> 
> Ich würde ausserdem nicht bei jeder Response explizit success = true
> zurück geben. Statt dessen könntest du im Fehlerfall (status != 200)
> eine aussagekräftige Exception werfen, z.B. bei status 404 eine
> ActionNotSupportedException. Momentan geht die Information warum etwas
> nicht funktioniert hat, verloren.

Ich wollte gerade was Ähnliches schreiben. Viele Methoden haben etwa folgende Struktur:

    def some_method(self):
        url = "http://api.imgur.com/irgend/eine/url"
        method = 'METHODE'
        resp, xxxx = self.client.request(url, method)
        if resp['status'] == '200':
            return {'success': True, 'result': xxxx}
        else:
            return {'success': False, 'result': xxxx}

Vorschlag:
Du schreibst eine helper-Methode:

    def _submit_request(self, url, method):
        resp, result = self.client.request(url, method)
        if resp['status'] == '404':
            raise My404Exception
        if resp['status'] == '403':
            raise My403Exception
        # and so on
        if resp['status'] != '200':
            raise MyOtherException
        return result

Dann werden die anderen Methoden viel kürzer (DRY!):

    def some_method(self):
        return self._submit_request("http://api.imgur.com/irgend/eine/url", 'METHODE')

Der Aufrufer bekommt nur das Ergebnis geliefert und im Fehlerfall eine sinnvolle Exception. Und Du hast weniger Code.

> Das ist einiges an Arbeit, aber ich damit wäre die Bibliothek für
> einen Benutzer noch einfacher zu verwenden und wie ich finde noch
> "pythonischer". Was meinen die Anderen dazu?

Genau!

Noch pythonischer wäre vielleicht:

    def _submit_request(self, url, method):
        exceptions = {'404': My404Exception, '403': My403Exception}
        resp, result = self.client.request(url, method)
        if resp['status'] in exceptions:
            raise exceptions[resp['status']]
        if resp['status'] != '200':
            raise MyOtherException
        return result

Gruß, Johannes

(Zu meiner Person: ich lese hier schon eine Weile passiv mit. Ich bin im Hauptberuf kein Programmierer, programmiere aber schon lange, seit ein paar Jahren mit Python. Jetzt habe ich sogar ein Django-Projekt, mit dem ich Geld verdienen will. Wenn ich es zeitlich mal schaffe, komme ich auch zu pycologne. PythonCamp hab ich mir vorgenommen.)




Mehr Informationen über die Mailingliste python-users