Python 执行函数时未定义全局名称
我正在编写一个项目,其中有两个文件(dataStructure.py和calculUser.py)一起工作,还有一个是测试文件 在Python 执行函数时未定义全局名称,python,python-2.7,Python,Python 2.7,我正在编写一个项目,其中有两个文件(dataStructure.py和calculUser.py)一起工作,还有一个是测试文件 在structureDonnees.py中,我有一个函数,用于读取包含汽车的数据集并构建数据结构: # -*-encoding:utf-8-*- import csv import sys #pour utiliser maximum et minimum du type float from calculUser import * from trajetUser i
structureDonnees.py
中,我有一个函数,用于读取包含汽车的数据集并构建数据结构:
# -*-encoding:utf-8-*-
import csv
import sys #pour utiliser maximum et minimum du type float
from calculUser import *
from trajetUser import *
def recupVoiture() :
#nom de la base de donnée
nomFichier = 'CO2_passenger_cars_v10.csv'
#on ouvre le fichier en lecture
opener = open(nomFichier, "r")
#On ouvre le fichier nomFichier en lecture
lectureFichier = csv.reader(opener, delimiter='\t')
#le dico contenant les carburants
fuelType = dict()
#le dico contenant les voitures
voiture = dict()
#le dico contenant les émissions de CO2 en g/km
emission = dict()
#minimum et maximum emission
min_emission = sys.float_info.max #initialisé à max(float) pour que l'on soit sûr que toutes les emissions soient plus petites
max_emission = sys.float_info.min #initialisé à min(float) pour que l'on soit sûr que toutes les emissions soient plus grandes
for row in lectureFichier :
#Si la colonne existe
if row:
#construction du dictionnaire voiture
if voiture.has_key(row[10]) :
if row[11].upper() not in voiture[row[10]] : voiture[row[10]].append("%s" %row[11].upper()) #on ajoute le modèle
else :
voiture[row[10]] = [] #on crée une liste vide contenant les modèles et leurs versions
voiture[row[10]].append("%s" %row[11]) #on ajoute le modèle et sa version
#construction du dictionnaire fuelType
if fuelType.has_key(row[10]) : fuelType[row[10]].append(row[19].upper()) #ajout du type de carburant utilisé par la voiture correspondante dans voiture{}
else :
fuelType[row[10]] = [] #on crée une liste vide contenant les carburants
fuelType[row[10]].append(row[19]) #ajout du type de carburant utilisé par la voiture correspondante dans voiture{}
#construction du dictionnaire emission
if emission.has_key(row[10]) :
emission[row[10]].append(row[14]) #ajout de la quantité de CO2 émise par la voiture correspondante dans voiture{}
min_emission = minEmission(float(row[14]), min_emission)
max_emission = maxEmission(float(row[14]), max_emission)
else :
emission[row[10]] = [] #on crée une liste vide contenant les émissions en CO2
fuelType[row[10]].append(row[14]) #ajout de la quantité de CO2 émise par la voiture correspondante dans voiture{}
min_emission = minEmission(float(row[14]), min_emission)
max_emission = maxEmission(float(row[14]), max_emission)
#On ferme le fichier
opener.close()
#La valeur de retour est un tableau contenant les structures de données générées.
res = [voiture, fuelType, emission, min_emission, max_emission]
return res
在calculUser.py
中,我定义了minEmission
和maxEmission
函数:
def minEmission(emissionFichier, min_emission) :
if emissionFichier < min_emission :
min_emission = emissionFichier
return min_emission
def maxEmission(emissionFichier, max_emission) :
if emissionFichier > max_emission :
max_emission = emissionFichier
return max_emission
我不明白为什么我会犯这个错误。通过执行除test.py
之外的所有操作,我没有得到任何错误,但是当我执行时,由于minEmission
和maxEmission
未定义,它不会执行
是因为我在定义函数时调用了函数吗?
我如何解决它?我解决了这个问题,我的函数
minEmission()
和maxEmission()
似乎无法引用max\u emission
和min\u emission
,因为这些变量是在structureDonnees.py
中声明的,而不是在calculUser.py
中声明的
我通过创建一个中间变量来修复它,该变量取min\u emission
和max\u emission
的值,并返回该值,而不是min\u emission
和max\u emission
另外,我还必须在calculUser import minEmission中直接在recupVoiture()函数中执行:,maxEmission
。我知道这很糟糕,但它解决了问题。我会用它直到找到更好更干净的解决方案
谢谢大家的帮助,如果我需要其他帮助,我会做得更好的帖子/代码!:) 顺便说一句,python有min
和max
,不需要重写它缩进被破坏了,所以很难确定,但是您是否在一个函数中定义了两个变量,并期望它们在完全不同的脚本中的不同函数中可用?不只是不工作,考虑一下在一个工作的世界里,程序是多么困难。确定你的行为,当你在做的时候,确保你创建一个最小的、完整的、可验证的例子()。-我们应该能够剪切代码片段并将其复制到命名文件中,然后通过python运行它,得到与您相同的错误。它说异常发生在structuredones.py
中。我在任何地方都看不到它的代码,所以我假设您在该文件中缺少一个import
,我不能使用min()和max(),因为我需要在包含我要查找的值的列表的字典中查找。我应该把所有的文件都放进去,这样你就可以看到我所有的代码了吗?或者我应该把导入和函数放在一起?这有多糟糕?糟糕的是,您执行的import*
操作很糟糕,可能会产生更多的问题,例如模块a
和b
都有一个函数名foo
,可以做不同(或相似)的事情,如果您从两个模块中导入*
,如果您调用foo,您可能会以错误的foo结束,不仅如此,而且6个月后,如果您再次访问您的代码并看到一个foo
,您将不知道它来自何处,或者更糟糕的是,您不知道其中一个模块有自己的foo,你可能会使用它,你的代码会做一些意想不到的事情,你将不知道为什么。。。
table = recupVoiture()
Traceback (most recent call last):
File "test.py", line 13, in <module>
tableau = recupVoiture()
File "/home/user/Polytech/ge3/ProjetPython/structureDonnees.py", line 60, in recupVoiture
min_emission = minEmission(float(row[14]), min_emission)
NameError: global name 'minEmission' is not defined