2010-10-07 6 views
21

Je suis en train de jouer avec un port simple de l'API Protovis vers Python.Conception d'une API Python: Interface ou arguments courants

Prenons l'exemple simple barre graphique, en Javascript:

var vis = new pv.Panel() 
    .width(150) 
    .height(150); 

vis.add(pv.Bar) 
    .data([1, 1.2, 1.7, 1.5, .7, .3]) 
    .width(20) 
    .height(function(d) d * 80) 
    .bottom(0) 
    .left(function() this.index * 25); 

vis.render(); 

Je débattant si vous souhaitez continuer à utiliser cette API de style interface fluide ou utiliser des paramètres nommés à la place. Avec des paramètres nommés, nous pourrions écrire:

vis = pv.Panel(width=150, 
       height=150) 

vis = vis + pv.Bar(data=[1, 1.2], 
        width=20, 
        height=lambda d: d * 80, 
        bottom=0, 
        left=lambda: self.index * 25) 
vis.render() 

Y a-t-il un style Python préféré?

+0

Intéressant. J'ai vu les deux. Par exemple Django utilise à la fois: les chaînes de méthodes et les arguments de mots-clés. –

+1

Peut-être que c'est juste moi, mais je pense que c'est moche: P – poke

+1

L'avantage de la syntaxe des mots-clés est que vous pouvez utiliser quelque chose comme 'pv.Bar (** kwargs)' plus facilement qu'avec l'API fluide. De plus, comme je l'ai vu en javascript avec jQuery, beaucoup de fonctions anonymes sont utilisées - elles ne sont pas très bien mises en correspondance avec Python. –

Répondre

21

Mon vote est anti-chaînage, pro-named-params.

  1. point-Enchaînement fait pour mauvais code IntelliSense puisque le prototype empirique est juste un panneau vide() ou Bar(), vous pouvez bien sûr pydoc là-dessus, mais en ce jour et l'âge IntelliSense est disponible en la plupart des IDE et un excellent booster de productivité. Le chaînage rend plus difficile la programmation de l'appel de la classe. C'est très agréable de pouvoir passer dans une liste ou de dicter comme * args, ** kwargs - alors que possible avec le chaînage, vous devez essentiellement prendre en charge les deux méthodes ou un tas de backflip pour méta-créer la classe. Le chaînage rend le code plus difficile à lire parce qu'inévitablement quelqu'un le fera sur une seule ligne, et se demande pourquoi les choses sont toutes gaffées quand elles sont passées dans le même param deux fois - vous pouvez l'éviter mais avec un Le nom du constructeur nommé dup du filtrage est fondamentalement intégré.

Questions connexes