Python 关于非类型的无法解释的错误

Python 关于非类型的无法解释的错误,python,ide,python-3.3,nonetype,Python,Ide,Python 3.3,Nonetype,我试图访问函数中的全局变量,但它似乎认为它是非类型的。有什么帮助吗? 这个错误似乎认为字典“students”是非类型的,它没有将其作为全局变量读取,即使我告诉它。这是我的代码中的错误还是此版本的python中的问题,我无法在任何其他程序上复制此错误(使用2.7-3.3.3版本!) #导入 从数学导入层 #全局声明(供以后使用) #功能 def loadData(): “”“加载students.txt文件(如果存在)。”“” studentsFile=open(“students.txt”、“

我试图访问函数中的全局变量,但它似乎认为它是非类型的。有什么帮助吗? 这个错误似乎认为字典“students”是非类型的,它没有将其作为全局变量读取,即使我告诉它。这是我的代码中的错误还是此版本的python中的问题,我无法在任何其他程序上复制此错误(使用2.7-3.3.3版本!)

#导入
从数学导入层
#全局声明(供以后使用)
#功能
def loadData():
“”“加载students.txt文件(如果存在)。”“”
studentsFile=open(“students.txt”、“r”)
data=studentsFile.read()
学生=执行(数据)
studentsFile.close()
留学生
def fileExists():
“”“检查students.txt文件是否存在。”“”
尝试:
studentsFile=open(“students.txt”、“r”)
studentsFile.close()
学生=加载数据()
除FileNotFoundError外:
studentsFile=open(“students.txt”、“w”)
studentsFile.close()
学生={}
印刷品(学生)
留学生
def saveToFile():
国际学生
studentsFile=open(“students.txt”、“w”)
studentsFile.write(str(students))
studentsFile.close()
def等级计算(分数):
可能等级={“A*”:[x代表范围(90,101)],“A:[x代表范围(80,90)],“B:[x代表范围(70,80)],“C:[x代表范围(60,70)],“D:[x代表范围(50,60)],“E:[x代表范围(40,50)],“F:[x代表范围(30,40)],“G:[x代表范围(20,30)],“U:[x代表范围(0,20)]]
对于可能的注册表项:
如果int(楼层(分数))处于可能的整体[关键点]:
等级=关键
def studentExists(studentName):
国际学生
印刷品(学生)
打印(学生姓名)
尝试:
testVar=students[studentName]
返回真值
除KeyError外:
返回错误
def doneTest(studentName,testName):
尝试:
testVar=学生[studentName][testName]
返回真值
除KeyError外:
返回错误
def整数输入(msg):
尽管如此:
尝试:
整数=int(输入(msg))
返回整数
除值错误外:
打印(“不是整数”)
def scoreInput():
尽管如此:
studentScore=整数输入(“输入学生分数:”)
如果studentScore=0:
打破
其他:
打印(“不在(包括)0和100之间。”)
返回学生分数
def getData():
国际学生
数量=整数输入(“您希望添加多少学生?”)
test=str(输入(“请输入测试名称:”).lower()
对于范围内的i(0,数量):
name=str(输入(“学生姓名:”).title()
分数=分数输入()
如果studentExists(name)=False:
学生[姓名]={}
学生[姓名][测验]=成绩
学生[姓名][考试+“成绩”]=成绩计算(分数)
def displayData():
国际学生
studentsToDisplay=[]
listOfGrades=[]
打印(“您必须选择一种模式。每个年级有多少学生或每个学生的成绩。”)
模式=输入(“请选择“成绩”或“学生”)。下()
如果模式=='grade':
test=str(输入(“您想访问哪个测试的分数?”).lower()
对于重点课程学生:
如果doneTest(键,测试)=真:
studentsToDisplay.append(键)
对于studentsToDisplay中的项目:
附加(学生[项目][测试+成绩])
打印(“等级:\nA*:”,ListOfGrades.count(“A*”),“\nA:”,ListOfGrades.count(“A”),“\nB:”,ListOfGrades.count(“B”),“\nC:”,ListOfGrades.count(“C”),“\nD:”,ListOfGrades.count(“D”),“\nE:”,ListOfGrades.count(“E”),“\nF:”,ListOfGrades.count(“F”),“\nG:”,ListOfGrades.count:“G”),“\nU:”,ListOfGrades:“U”)
elif模式==“学生”:
studentName=str(输入(“学生姓名:”).title()
test=str(输入(“测试名称:”).lower()
如果doneTest(studentName,test)=True:
打印(学生姓名,“got”,学生[学生姓名][考试],“这是成绩:”,学生[学生姓名][考试+“成绩”])
def main():
国际学生
students=fileExists()
尽管如此:
choice=str(输入(“您想添加学生/测试还是想查看以前的数据?(接受“添加”和“查看”)))。lower()
如果选项==“添加”:
getData()
saveToFile()
elif选项==“审查”:
displayData()
其他:
exitChoice=str(输入(“您想退出吗?”).lower()
如果exitChoice==“是”或exitChoice==“y”:
打破
main()
我得到这个错误:

Traceback (most recent call last):
  File "V:\GCSE 2013\sj.sully\Programme Library\Assessed Tasks and CAT Practice\CAT Practice Scenario 1 Code.py", line 108, in <module>
    main()
  File "V:\GCSE 2013\sj.sully\Programme Library\Assessed Tasks and CAT Practice\CAT Practice Scenario 1 Code.py", line 100, in main
    getData()
  File "V:\GCSE 2013\sj.sully\Programme Library\Assessed Tasks and CAT Practice\CAT Practice Scenario 1 Code.py", line 71, in getData
    if studentExists(name) == False:
  File "V:\GCSE 2013\sj.sully\Programme Library\Assessed Tasks and CAT Practice\CAT Practice Scenario 1 Code.py", line 39, in studentExists
    testVar = students[studentName]
TypeError: 'NoneType' object is not subscriptable
回溯(最近一次呼叫最后一次):
文件“V:\GCSE 2013\sj.sully\program Library\Assessed Tasks and CAT Practice\CAT Practice Scenario 1 Code.py”,第108行,在
main()
文件“V:\GCSE 2013\sj.sully\program Library\Assessed Tasks and CAT Practice\CAT Practice Scenario 1 Code.py”,第100行,主文件
getData()
文件“V:\GCSE 2013\sj.sully\Program Library\Assessed Tasks and CAT Practice\CAT Practice Scenario 1 Code.py”,第71行,在getData中
如果studentExists(name)=False:
studentExists中第39行的文件“V:\GCSE 2013\sj.sully\Program Library\Assessed Tasks and CAT Practice\CAT Practice Scenario 1 Code.py”
testVar=students[studentName]
TypeError:“非类型”对象不可下标

我使用的是python 3.3.0。

如果
students
为None,那是因为在使用它之前没有定义
students

但使用globals解决这样的问题是疯狂的。实际上,使用globals是邪恶的,不应该这样做

Python是一种OOP语言,因此您应该为正确的任务使用正确的工具。 对于您的特定用例,您可以使用一个类,例如:

class StudentsData:
    def __init__(self):
        self.students = []

    def loadData(self):
        pass

    def fileExists(self):
        pass

    def save(self):
        pass

    def scoreInput(self):
        pass

    def display(self):
        pass
def gradeCalc(score):
    pass

def main():
    pass
但有些函数并不打算在类中使用,例如:

class StudentsData:
    def __init__(self):
        self.students = []

    def loadData(self):
        pass

    def fileExists(self):
        pass

    def save(self):
        pass

    def scoreInput(self):
        pass

    def display(self):
        pass
def gradeCalc(score):
    pass

def main():
    pass
我不会给你我想要的