2009-06-02 7 views
1

J'écris une extension python pour fournir un accès aux données Solaris kstat (dans le même esprit que la bibliothèque Perl d'expédition Sun :: Solaris :: Kstat) et j'ai une question sur le retour conditionnel d'une liste ou un seul objet. Le cas d'utilisation de python ressemblerait à quelque chose comme:Etiquette d'objet retourné par l'extension Python

 
    cpu_stats = cKstats.lookup(module='cpu_stat') 
    cpu_stat0 = cKstats.lookup('cpu_stat',0,'cpu_stat0') 

Comme il est actuellement mis en œuvre, la recherche() retourne une liste de tous les objets qui kstat correspondance. Le premier cas aboutirait à une liste d'objets (autant qu'il y a de CPU) et le second appel spécifie un kstat complet et renverrait une liste contenant un kstat.

Ma question est-ce une mauvaise forme de retourner un seul objet quand il n'y a qu'une seule correspondance, et une liste quand il y en a plusieurs?

Merci pour la réponse réfléchie! Mon python-fu est faible mais de plus en plus fort en raison de gens comme vous.

+0

Même si vous posez cette question dans le contexte de l'écriture d'un module d'extension, la réponse est la même si vous écrivez des fonctions Python pures. – Miles

Répondre

7

"Ma question est de mauvaise forme pour retourner un seul objet lorsqu'il n'y a qu'une seule correspondance, et une liste quand il y en a plusieurs?"

Il est de mauvaise forme de retourner des types incohérents.

Retourne un type cohérent: Liste de kstat.

La plupart des Pythonistas n'aiment pas utiliser type(result) pour déterminer s'il s'agit d'un kstat ou d'une liste de kstats.

Nous préférons vérifier la longueur de la liste d'une manière simple et cohérente.

En outre, si la longueur dépend d'une partie des informations système, une méthode API peut éventuellement fournir ces métadonnées.

Regardez DB-API PEP pour obtenir des conseils et des idées sur la façon de gérer les requêtes.

+1

Je crois, alors, que votre réponse devrait dire «Oui», pas «Non», car vous soutenez que c'est * une mauvaise forme. –

+0

+1 Tout à fait raison. Et surtout pour le lien DB-API. –