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

Johannes Ammon j.ammon at terminnetz.de
Mo Mär 14 17:23:14 CET 2011


(Noch mal, vorhin habe ich mit dem falschen Absender gepostet, da blieb die Mail in der Moderatorschleife hängen.)

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.)

-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://lists.uni-koeln.de/pipermail/python-users/attachments/20110314/3d256eaa/attachment.html>


Mehr Informationen über die Mailingliste python-users