Hello,
Effectivement j'ai mal décrit l'organisation de mes modules. Comme je l'ai dit mon appli fait des calculs statistiques différents sur des objets communs.
Donc là j'ai :
Calc1.py : programme principal (c'est là que je crée mon objet logFile et édite le premier message de log, et que je crée mes instances d'Entrepot). l'objectif est de créer de nouveaux programmes (Calc2, 3,...) au fur et à mesure des besoins.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| # Codage :
# -*- coding:Utf-8 -*-
#
# Calc1
#______
# imports
import os
import csv
from S3Library import *
# Création d'une instance de fichier de log
logFile = S3Log('Log.txt')
logFile.log(0,"Debut de traitement")
# lecture des données et calcul
Reader = csv.DictReader(open('EntrepotData.csv'), delimiter=';',quotechar='"')
# défini la nomenclature du fichier
nomenclature = Reader.next()
for row in Reader:
# instanciation d'un entrepot
entrepot1 = Entrepot(nomenclature, row)
#
# ...suite du calcul |
S3Library.py : Classes "fonctionnelles", c'est à dire les objets communs qui seront utilisés par mes différents programmes de calcul, et qui contient notamment la classe Entrepot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # -*- coding:Utf-8 -*-
#
# S3Library.py
# #
# Bibliothèque standard du moteur de calcul #
# #
# Cette bibliothèque contient l'ensemble des objets nécessaires aux calculs #
# #
#______________________________________________________________________________#
from UserDict import UserDict
from datetime import datetime
from S3Tools import *
# Classe Entrepot
class Entrepot:
def __init__(self, nomenclature, entrepot):
for k, v in entrepot.items():
w = typage(nomenclature, k, v)
setattr(self, k, w) |
S3Tools.py : objets et fonctions "utilitaires", communs à l'ensemble de l'application, pour l'instant la classe S3Log et la fonction typage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| # -*- coding:Utf-8 -*-
#
# S3Tools.py
#
# outils du moteur de calcul
#
# Fonction typage : typage et contrôle des attributs
#_______________________________________________________________________________
from datetime import datetime
#_______________________________________________________________________________
# Fonction typage
#
# Défini le type et contrôle la validité des données lors de l'instanciation
# des principaux objets du moteur de calcul
#
# en entrée :
# nomenclature : dictionnaire attribut/type
# cle : attribut à typer
# valeur : valeur de l'attribut
#
# en sortie :
# valeur : attribut de type recherché ou None
#_______________________________________________________________________________
def typage(nomenclature, cle, valeur):
logAtt = None
try:
typeValeur = nomenclature[cle]
except:
logAtt = 1
logMess = "Fonction typage : %s, donnée inexistante" % (cle)
else:
if typeValeur == "cr":
return valeur
elif typeValeur == "en":
try:
return int(valeur)
except:
logAtt = 1
logMess = "Fonction typage: %s n'est pas un nombre entier valide (%s)" % (cle, valeur)
elif typeValeur == "dc":
try:
return float(valeur)
except:
logAtt = 1
logMess = "Fonction typage: %s n'est pas un nombre décimal valide (%s)" % (cle, valeur)
elif typeValeur == "dt":
try:
return datetime.strptime(valeur, "%d/%m/%Y")
except:
logAtt = 1
logMess = "Fonction typage: %s n'est pas une date valide (%s)" % (cle, valeur)
elif typeValeur == "cr/en":
try:
return int(valeur)
except:
return valeur
elif typeValeur == "cr/dc":
try:
return float(valeur)
except:
return valeur
elif typeValeur == "cr/dt":
try:
return datetime.strptime(valeur, "%d/%m/%Y")
except:
return valeur
if logAtt:
S3Tools.logFile.log(logAtt, logMess)
#_______________________________________________________________________________
# Class S3Log
#
# Ecriture d'un message d'alerte dans le log du traitement
#
# en entrée :
# - niveau : niveau d'alerte
# (0= information 1=warning, 2=erreur non fatale, 3=erreur fatale)
# - message à éditer
#_______________________________________________________________________________
class S3Log:
"""fichier log de traitement"""
def __init__(self,fichier):
self.logFile = open(fichier,'w')
def log(self, niveau, message):
log = str(datetime.now()) + " " + str(niveau) + " " + str(message) + "\n"
self.logFile.write(log)
#
# EOF |
Mais en fait, je ne sais pas si c'est important, car j'ai fait un essai en regroupant S3Library et S3Tools dans le seul module S3Library, et mon problème subsiste : mon objet logFile instancié dans Calc1.py n'est visiblement pas utilisable dans ma fonction typage, ou en tout cas par une simple référence logFile.log.
Dois-je le qualifier autrement ? genre quelquechose.logfile.log ?
Je pensais naïvement que des variables ou des objets définis dans un niveau étaient accessibles aux niveaux inférieurs ?
Partager