web-dev-qa-db-fra.com

Pourquoi pas de «const» en Python?

Je viens du milieu C et j'apprends Python. Le manque de sécurité explicite des caractères est inquiétant, mais je m'y habitue. L'absence de programmation contractuelle intégrée (classes abstraites pures, interfaces) est une chose à laquelle s'habituer, face à tous les avantages d'un langage dynamique.

Cependant, l'impossibilité de demander const-cortectness me rend fou! Pourquoi n'y a-t-il pas de constantes en Python? Pourquoi constantes au niveau de la classe découragé?

39
Vorac

C et Python appartient à deux classes différentes de langages.

Le premier est tapé statiquement . Ce dernier est dynamique .

Dans un langage typé statiquement, le vérificateur de type est capable d'inférer le type de chaque expression et de vérifier si cela correspond à la déclaration donnée pendant la phase de "compilation" .

Dans une langue typée dynamiquement, les informations de type requises ne sont pas disponibles avant l'exécution. Et le type d'une expression peut varier d'une exécution à l'autre. Bien sûr, vous pouvez ajouter la vérification de type pendant l'exécution du programme. Ce n'est pas le choix fait en Python. Cela a pour avantage de permettre le "typage canard". L'inconvénient est que l'interpréteur n'est pas en mesure de vérifier l'exactitude du type.

Concernant le mot-clé const . Il s'agit d'un modificateur de type . Restreindre l'utilisation autorisée d'une variable (et parfois modifier l'optimisation autorisée du compilateur). Il semble assez inefficace de vérifier cela au moment de l'exécution pour un langage dynamique. En première analyse, cela impliquerait de vérifier si une variable est const ou non pour chaque affectation. Cela pourrait être optimisé, mais en vaut-il la peine?

Au-delà des aspects techniques, n'oubliez pas que chaque langue a sa propre philosophie. Dans Python le choix habituel est de privilégier la "convention" au lieu de la "restriction". Par exemple, la constante doit être orthographiée dans toutes les majuscules. Il n'y a pas d'application technique de cela. C'est juste un Si vous la suivez, votre programme se comportera comme prévu par les "autres programmeurs". Si vous décidez de modifier une "constante", Python ne se plaindra pas. Mais vous devriez vous sentir comme si vous faisiez "quelque chose de mal". Vous violez une convention. Peut-être avez-vous vos raisons de le faire. Peut-être que vous ne devriez pas avoir. Votre responsabilité.

Enfin, dans les langages dynamiques, la "justesse" d'un programme est beaucoup plus de la responsabilité de vos tests unitaires que de la main du compilateur. Si vous avez vraiment du mal à faire le pas, vous trouverez autour de quelques "vérificateurs de code". Ce sont PyLint , PyChecker , PyFlakes ...

22
Sylvain Leroux

Je ne sais pas pourquoi cette décision de conception a été prise, mais je pense personnellement qu'il n'y a pas de mot clé const explicite car les principaux avantages des constantes sont déjà disponibles:

  • Les constantes sont bonnes à des fins de documentation. Si vous voyez une constante, vous savez que vous ne pouvez pas la changer. Ceci est également possible en nommant les conventions.

  • Les constantes sont utiles pour les appels de fonction. Si vous passez une constante comme paramètre à une fonction, vous pouvez être sûr qu'elle n'est pas modifiée. Dans Python sont des "appels par valeur", mais comme les variables python sont des références, vous passez effectivement une copie d'une référence. À l'intérieur de la fonction, vous pouvez muter la référence mais si vous la réaffectez, les modifications ne persistent pas en dehors de l'étendue de la fonction. Par conséquent, si vous passez un nombre sous forme de variable, il est en fait passé "comme" une constante. Vous pouvez affecter une nouvelle valeur à la variable Mais en dehors de la fonction, vous avez toujours l'ancien numéro

De plus, s'il y avait un mot-clé const, cela créerait une asymétrie: les variables sont déclarées sans mot-clé mais les consts sont déclarées avec un mot-clé. La conséquence logique serait de créer un deuxième mot-clé nommé var. C'est probablement une question de goût. Personnellement, je préfère l'approche minimaliste aux déclarations de variables.

Vous pouvez probablement obtenir un peu plus de sécurité de type, si vous travaillez avec des structures de données immuables comme les tuples. Attention cependant, le Tuple lui-même ne peut pas être modifié. Mais s'il contient des références à des objets mutables, ceux-ci sont toujours mutables même s'ils appartiennent à un Tuple.

Enfin, vous voudrez peut-être jeter un œil à cet extrait: http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991 Je ne suis pas sûr s'il s'agit d'une implémentation de "constantes de niveau classe". Mais j'ai pensé que cela pourrait être utile.

4
lhk