2010-02-12 6 views
3

J'intègre Python dans une application. MyClass.name est une propriété de type str:Quel comportement est préféré? (Incorporation de Python)

>>> foo = MyClass() 
>>> foo.name 
'Default Name' 

Dois-je permettre aux utilisateurs de le faire:

>>> foo.name = 123 
>>> foo.name 
'123' 

ou non?

>>> foo.name = 123 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: name must be a string 
+2

ceci ** dépend totalement de votre application –

+0

Je suis à la recherche d'un moyen * pythonic * de le faire. Y a-t-il? –

+0

c'est au-delà de la façon * pythonic * – SilentGhost

Répondre

4

Augmentez certainement TypeError plutôt que de tenter de contraindre automatiquement. Normalement, je serais conservateur de dire que quelque chose est "pythonique" ou pas - c'est un de ces mots qui signifie simplement "l'orateur pense que c'est bon" - mais si cela signifie quelque chose, il doit se référer à adhering to the Zen of Python, et dans ce cas, c'est dictum 12: "Face à l'ambiguïté, refusez la tentation de deviner."

À l'heure actuelle, vous êtes en train de regarder des entiers, mais qu'en est-il des flottants, ou Decimal s, ou Fraction s? Utilisez-vous le str ou le repr de votre valeur? La bonne valeur de chaîne est-elle "Decimal ('10 ')" ou "10" si vous avez une instance Decimal? Qu'en est-il des tuples, des listes, des chaînes, des octets, des tableaux, des dicts et de tous les autres types intégrés dans Python? Qu'en est-il des types définis par l'utilisateur que vous ne connaissez pas encore, et que vous ne pouvez pas savoir parce qu'ils font partie d'un programme qui n'a pas encore été écrit?

Il est peu probable que votre bibliothèque soit assez spéciale pour avoir un comportement bizarre et automatique qui va perturber les gens habitués aux conventions de Python. (Dictum 8: "Les cas spéciaux ne sont pas assez spéciaux pour enfreindre les règles.") Cependant, si cela améliore vraiment la facilité d'utilisation de votre bibliothèque, et vous vous sentez capable de répondre à toutes ces questions pour n'importe quel type l'utilisateur peut affecter, puis aller de l'avant et faire une coercition magique. (Dictum 9: "Bien que la praticité bat la pureté.") Mais c'est une bibliothèque très rare en effet qui a vraiment besoin de ce genre de comportement, et si vous le faites, documentez-le pour que lorsque cela fait quelque chose de surprenant, (ou même peut-être juste vous-même!) peut revenir en arrière et lire sur les règles spécifiques.

+2

Si la documentation est assez claire sur ce qui doit être passé, et ce qui va se passer quand des non-chaînes sont passées, je ne vois aucune raison de préférer l'une à l'autre. – SilentGhost

+0

Si une liste peut accepter n'importe quel itérable, pourquoi l'attribut goodrone ne peut-il accepter aucun objet pouvant être contraint en chaîne? Où est la devinette ou l'ambiguïté ici? – gruszczy

1

Cela dépend vraiment de ce que vous voulez réaliser. Je pense que la meilleure solution est de permettre n'importe quel objet, qui peut être contraint à la chaîne, puis utiliser les propriétés python.

class MyClass(object): 

    def set_name(self, name): 
    self._name = str(name) 
    def get_name(self): 
    return self._name 
    name = propert(get_name, set_name) 
Questions connexes