Importer une longue liste de constantes dans un fichier Python

90

En Python, existe-t-il un analogue de l' Cinstruction du préprocesseur tel que?:

#define MY_CONSTANT 50

De plus, j'ai une grande liste de constantes que j'aimerais importer dans plusieurs classes. Existe-t-il un analogue de la déclaration des constantes comme une longue séquence d'instructions comme celle ci-dessus dans un .pyfichier et de son importation dans un autre .pyfichier?

Éditer.

Le fichier Constants.pylit:

#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

Et myExample.pylit:

#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""

import sys
import os

import Constants

class myExample:
    def __init__(self):
        self.someValueOne = Constants.MY_CONSTANT_ONE + 1
        self.someValueTwo = Constants.MY_CONSTANT_TWO + 1

if __name__ == '__main__':
    x = MyClass()

Éditer.

Depuis le compilateur,

NameError: "le nom global 'MY_CONSTANT_ONE' n'est pas défini"

function init dans monExemple à la ligne 13 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 sortie de copie Programme sorti avec le code # 1 après 0,06 seconde.

SK9
la source
2
Non, il n'y a pas de préprocesseur. Et non, vous n'irez pas très loin en essayant de coder C en Python, ou même en essayant de trouver des parallèles.
Ce n'est pas le traçage complet. Comment le gérez-vous? python myExample.pydevrait donner une trace de l'erreur qui inclut les noms de fichiers et <module>comme niveau supérieur. De plus, les références MY_CONSTANT_ONE ne sont pas un nom global - vraiment bizarre. Vérifiez trois fois que ce sont vraiment les fichiers que vous exécutez (et peut-être les convertir en ASCII et supprimer le # encoding: utf8bit).
@All: Merci, je semble aller bien maintenant - je ne sais pas encore pourquoi, mais tant pis :).
SK9

Réponses:

132

Python n'est pas prétraité. Vous pouvez simplement créer un fichier myconstants.py:

MY_CONSTANT = 50

Et les importer fonctionnera simplement:

import myconstants
print myconstants.MY_CONSTANT * 2
Thomas K
la source
@ SK9: Eh bien, montrez le code exact que vous exécutez (à la fois en définissant et en utilisant le module).
@Thomas: Voir ci-dessus. J'ai certainement raté quelque chose de stupide pendant que j'apprends les bases.
SK9
@ SK9: Il n'y a pas une telle erreur dans le code que vous avez publié. Je l'ai vérifié plusieurs fois et l'ai exécuté moi-même, cela fonctionne très bien. Cela ne peut même pas conduire à cette erreur (il n'y a aucune référence à un nom MAX_FIVE_FLUSH_KEY_INT). Publiez le retraçage.
@Thomas: Merci d'avoir testé ça. Hmm, je vais essayer à nouveau. (La référence à laquelle il est fait allusion est une faute de frappe.) Vous avez essayé les fichiers tels quels? (J'ai copié et collé le contenu complet ci-dessus.)
SK9
@ SK9: je ne suis pas Thomas;) Et oui, j'ai tout copié et collé, j'ai même laissé les noms de fichiers tels quels. Encore une fois, le traçage nous aiderait au débogage.
18

Python n'a pas de préprocesseur, ni de constantes dans le sens où elles ne peuvent pas être modifiées - vous pouvez toujours changer (presque, vous pouvez émuler des propriétés d'objet constantes, mais le faire pour des raisons de constance est rarement fait et non considéré comme utile) tout. Lors de la définition d'une constante, nous définissons un nom qui est en majuscules avec des traits de soulignement et l'appelons un jour - «Nous sommes tous des adultes consentants ici», aucun homme sensé ne changerait une constante. À moins bien sûr qu'il ait de très bonnes raisons et qu'il sache exactement ce qu'il fait, auquel cas vous ne pouvez pas (et ne devriez probablement pas) l'arrêter de toute façon.

Mais bien sûr, vous pouvez définir un nom au niveau du module avec une valeur et l'utiliser dans un autre module. Ce n'est pas spécifique aux constantes ou à quoi que ce soit, lisez le système de modules.

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

la source
11

Et bien sûr, vous pouvez faire:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT
Tony
la source
3
import * est déconseillé en général, mais les constantes manifestes de style C qui sont largement utilisées dans une base de code sont l'un des endroits où il n'est pas insensé de l'utiliser. Les nommer dans ALL_CAPS ou avec une convention de préfixe qui réduit la possibilité de collision avec d'autres symboles supprime l'objection principale à l'idiome, et si une collision se produit, vous pouvez toujours revenir au style conventionnel import + nom explicite (import a; a .MY_CONSTNAT), contrairement à C.
Russell Borogove le
aussi a.MY_CONSTNAT un peu plus lent, c'est parce que l'interprète recherche dans un espace de noms pour le nom 'a' puis dans le second nom d'ennemi 'MY_CONSTNAT'
tony
7

Bien sûr, vous pouvez placer vos constantes dans un module séparé. Par exemple:

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

print const.A, const.B, const.C

Notez que comme mentionnées ci - dessus, A, Bet Csont des variables, par exemple peuvent être modifiés lors de l'exécution.

NPE
la source
5

Essayez de chercher Créer des constantes en utilisant un module "paramètres"? et Puis-je empêcher la modification d'un objet en Python?

Un autre lien utile: http://code.activestate.com/recipes/65207-constants-in-python/ nous indique l'option suivante:

from copy import deepcopy

class const(object):

    def __setattr__(self, name, value):
        if self.__dict__.has_key(name):
            print 'NO WAY this is a const' # put here anything you want(throw exc and etc)
            return deepcopy(self.__dict__[name])
        self.__dict__[name] = value

    def __getattr__(self, name, value):
        if self.__dict__.has_key(name):
            return deepcopy(self.__dict__[name])

    def __delattr__(self, item):
        if self.__dict__.has_key(item):
            print 'NOOOOO' # throw exception if needed

CONST = const()
CONST.Constant1 = 111
CONST.Constant1 = 12
print a.Constant1 # 111
CONST.Constant2 = 'tst'
CONST.Constant2 = 'tst1'
print a.Constant2 # 'tst'

Vous pouvez donc créer une classe comme celle-ci, puis l'importer depuis votre module contants.py. Cela vous permettra d'être sûr que cette valeur ne sera pas modifiée, supprimée.

Artsiom Rudzenka
la source
Merci pour cela. Avant de demander SO, j'ai cherché et trouvé les deux. :)
SK9
@ SK9 oh, désolé pour le double alors
Artsiom Rudzenka
4

Au lieu d'utiliser l'approche d'importation décrite dans plusieurs réponses, jetez un œil au module configparser .

La classe ConfigParser implémente un langage d'analyseur de fichiers de configuration de base qui fournit une structure similaire à celle que vous trouveriez sur les fichiers INI de Microsoft Windows. Vous pouvez l'utiliser pour écrire des programmes Python qui peuvent être facilement personnalisés par les utilisateurs finaux.

Fredrik Pihl
la source
2

Si vous voulez vraiment des constantes, pas seulement des variables ressemblant à des constantes, la manière standard de le faire est d'utiliser des dictionnaires immuables. Malheureusement, ce n'est pas encore intégré, vous devez donc utiliser des recettes tierces (comme celle-ci ou celle-là ).

vartec
la source
2

créer un fichier de constante avec n'importe quel nom comme my_constants.py déclarer une constante comme ça

CONSTANT_NAME = "SOME VALUE"

Pour accéder à la constante dans votre fichier d'importation de code comme ça

import my_constants as constant

et accédez à la valeur constante comme -

constant.CONSTANT_NAME
Rajanbhadauria
la source