web-dev-qa-db-fra.com

Importer une longue liste de constantes dans un fichier Python

En Python, existe-t-il un analogue de l’instruction de préprocesseur C telle que ?:

#define MY_CONSTANT 50

En outre, j'ai une grande liste de constantes que je voudrais importer dans plusieurs classes. Existe-t-il un analogue consistant à déclarer les constantes sous la forme d'une longue séquence d'instructions comme celle ci-dessus dans un .py fichier et l’importer dans un autre .py fichier?

Modifier.

Le fichier Constants.py lit:

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

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

Et myExample.py lit:

#!/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 __== '__main__':
    x = MyClass()

Modifier.

Du compilateur,

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

function init dans myExample à la ligne 13 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 copie du programme Exit avec le code n ° 1 après 0,06 seconde.

69
SK9

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

MY_CONSTANT = 50

Et les importer ne fonctionnera que:

import myconstants
print myconstants.MY_CONSTANT * 2
97
Thomas K

Python n'a pas de préprocesseur, pas plus que de constantes en ce sens qu'elles ne peuvent pas être changées - vous pouvez toujours changer (presque, vous pouvez émuler des propriétés d'objet constantes, mais le faire dans un souci de constance est rarement fait et non considéré utile) tout. Lorsque nous définissons une constante, nous définissons un nom majuscule avec des tirets bas et appelons cela 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, dans ce 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 de niveau 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 sur le système de module.

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT
15
user395760

Et bien sûr, vous pouvez faire:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT
8
tony

Bien sûr, vous pouvez mettre 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 indiqué ci-dessus, A, B et C sont des variables, c’est-à-dire qu’elles peuvent être modifiées au moment de l’exécution.

7
NPE

Essayez de regarder 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 parle de 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 et l'importer à partir de votre module contants.py. Cela vous permettra de vous assurer que cette valeur ne sera pas modifiée, supprimée.

4
Artsiom Rudzenka

Au lieu d'utiliser l'approche d'importation décrite dans plusieurs réponses, consultez le module configparser .

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

4
Fredrik Pihl

Si vous voulez vraiment des constantes, et pas seulement des variables ressemblant à des constantes, la méthode standard consiste à utiliser des dictionnaires immuables. Malheureusement, il n'est pas encore intégré, vous devez donc utiliser des recettes tierces (comme celui-ci ou celui-là ).

1
vartec