web-dev-qa-db-fra.com

Dois-je vraiment utiliser toutes les majuscules pour mes constantes?

Je suis un programmeur Python principalement qui utilise pylint pour linting le code source. Je suis en mesure d'éliminer tous les avertissements sauf un: nom invalide pour une constante. Changer le nom en majuscules le corrige, mais est-ce que je suis vraiment censé faire ça? Si je le fais, je trouve que mon code a l'air moche car la plupart des variables sont constantes (selon pylint).

37
Abhishek Kumar

Vous écrivez probablement du code comme ceci:

notes_director = argv[1]
chdir(notes_director)
files = glob('*.txt')
Rand_file = choice(files)
with open(Rand_file) as notes_file: 
    points = notes_file.readlines() 
    Rand_point = choice(points)

Vous devez déplacer ce code dans une fonction:

def main():
    notes_director = argv[1]
    chdir(notes_director)
    files = glob('*.txt')
    Rand_file = choice(files)
    with open(Rand_file) as notes_file: 
        points = notes_file.readlines() 
        Rand_point = choice(points)

# actually call the main function    
main()

Pylint suppose que le code qui fait réellement le travail sera à l'intérieur d'une fonction. Parce que vous avez ce code au niveau supérieur de votre code au lieu de l'intérieur d'une fonction, cela devient confus.

De manière générale, il est préférable de travailler à l'intérieur d'une fonction plutôt qu'au niveau supérieur. Cela vous permet de mieux organiser ce que vous faites et facilite sa réutilisation. Vous ne devriez vraiment avoir que du code exécutant un algorithme en dehors d'une fonction dans un script rapide et sale.

33
Winston Ewert

Oui. Selon la règle PEP8 sur constantes :

Les constantes sont généralement définies au niveau du module et écrites en majuscules avec des traits de soulignement séparant les mots. Les exemples comprennent MAX_OVERFLOW et TOTAL.

Version longue:

Dans la communauté Python (comme dans beaucoup d'autres communautés) il existe des conventions sur la façon d'écrire du code. Ceci est différent du code de travail : même si vous écrivez vos constantes en minuscules, votre code fonctionne toujours.

Mais il existe un consensus de la communauté (comme documenté dans PEP8) qui est "appliqué" avec des outils comme pylint . Si vous programmez pour votre propre bonheur, vous pouvez négliger les indices que vous donne le pylint. Si vous voulez un échange ouvert avec la communauté, alias "quelqu'un d'autre que moi devrait utiliser mon code", vous devez préparer votre code selon PEP8.

22
Thomas Junk

La norme communautaire PEP8 et Python consiste à utiliser ALL_CAPS_CONSTANTS. C'est un indice visuel commun, utilisé depuis des décennies en C, Java, Perl, PHP, Python, bash et d'autres langages de programmation et environnements Shell. Mais dans le langage moderne en ligne, TOUS LES MAJUSCULES SIGNIFIENT CRIER . Et crier est impoli.

Python est cependant assez incohérent à propos de ALL_CAPS_CONSTANTS. JavaScript peut avoir Math.PI, mais Python a math.pi. Il n'y a pas de constante plus reconnaissable ou durable que π. Ou considérez sys.version_info, la version de Python que vous utilisez. 100% constant pendant la durée de vie de votre programme - bien plus que PORT ou MAX_ITERATIONS ou d'autres constantes que vous définiriez. Ou que diriez-vous sys.maxsize? La valeur entière native maximale de votre plate-forme est constante non seulement sur une ou deux exécutions de programme, mais sur la durée de vie de votre matériel.

Si ces constantes - y compris certaines comme π et e qui sont des constantes fondamentales de l'univers, et ne varieront pas sur toute l'éternité - si elles peuvent être minuscules, eh bien ... tout comme les autres constantes. Tu peux choisir.

Rappelez-vous, PEP8 est un guide de style. Une ligne directrice, pas une loi. Une directive est souvent enfreinte même par la bibliothèque standard de Python. Et en citant un autre noyau Python guideline, PEP2 (aka "The Zen of Python")):

  • Beau, c'est mieux que laid
  • La lisibilité compte
  • La praticité l'emporte sur la pureté.

Sur le plan pratique, lorsque le programme YELLY_CONSTANT et SHOUTY_PARAMETER commence à grincer, cela aide à se rappeler que les constantes tout-cap ne sont généralement pas vraiment durables idéaux platoniciens , mais les paramètres d'un programme s'exécutent. Il n'y a rien de vraiment constant à propos de PORT, SITENAME ou NUMRUNS, et ils n'ont pas à être gérés comme des globaux de programme autonomes. Par exemple, ils peuvent être déposés dans un dictionnaire sous la forme d'un ensemble de paramètres de programme accessible à l'échelle mondiale:

config = {
    'port': 80,
    'sitename': "Bubba's Blog",
    'numruns': 100,
}

Python dispose également d'une fonction fine de transmission de paramètres de mots clés qui réduit la nécessité d'utiliser APPARENTLY_ANGRY_GLOBAL_VARIABLES:

def process_data(sitename, port=80, numruns=100):
    ...

process_data("Bubba's Blog")

En pratique, bon nombre de ces valeurs seront (ou devraient être) lues à partir de fichiers de configuration, de variables d'environnement du système d'exploitation, d'arguments de ligne de commande ou d'autres sources pour satisfaire le principe/modèle inversion de contrôle . Mais c'est une histoire plus grande pour un autre jour.

16
Jonathan Eunice

Oui, c'est assez courant dans la plupart des langages de programmation (du moins ceux que j'utilise).

Vous pouvez vous y référer lien Google pour partager un style commun entre les développeurs de la même équipe.

Il est conseillé d'utiliser

Type                  |Public          |Internal
Global/Class Constants|CAPS_WITH_UNDER |_CAPS_WITH_UNDER
1
alain.janinm

Le code fonctionnera que vous mettiez des constantes en majuscule. Ces soi-disant "constantes" ne sont que des variables qui ne changeront pas pendant l'exécution du code.

Mon opinion personnelle est que si elles sont capitalisées, il est plus facile de se souvenir qu'elles sont supposées être des constantes.

import operator

OPERATIONS = {"+": operator.add, "-": operator.sub}

def check_answer(num_1, num_2, operation, user_answer):
    correct_answer = OPERATIONS.get(operation)(num_1, num_2)
    is_correct = user_answer == correct_answer
    return (is_correct, correct_answer)

De plus, PEP8 dit que vous devez utiliser des majuscules .

0
Gaetano Barreca