Python 执行函数时未定义全局名称

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

我正在编写一个项目,其中有两个文件(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 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