- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当“文件名”是一个存在的文件时,这段代码运行良好……但是当它不存在时……我不断收到同样的错误:TypeError: 'NoneType' 对象不可迭代 (Errno 2)
尽管我从不迭代任何东西,除非在函数的一开始就打开了一个文件。我已经多次查看我的代码,但找不到我要在何处迭代不可迭代的对象。
注意。我也尝试过“除了 IOError”,我得到了相同的结果。
该函数只有一个参数,即变量“文件名”
回溯:
Traceback (most recent call last):
File "C:\Users\Saume\Workspace\Chess\src\Main.py", line 431, in <module>
game1, board1 = loadgame(inp_f)
TypeError: 'NoneType' object is not iterable
注意。对该函数的调用是使用从用户输入“inp_f”中收集的字符串完成的(loadgame 是函数的名称)
代码如下:
try:
f = open(filename, "r")
file_empty = False
except FileNotFoundError:
file_empty = True
# file doesn't exist, error string
if file_empty: # empty save file, create a new game
g, b = creategame() # this function works 100%... no problems here
else:
# amount of each pieces
tb = 0
tn = 0
cb = 0
cn = 0
fb = 0
fn = 0
db = 0
dn = 0
rb = 0
rn = 0
pb = 0
pn = 0
d = {} # dictionnary for the board
n = 0
f_game = ""
f_pieces = []
for line in f: # iterate on the file... only if file_empty == False....
if n == 0: # first line contains general game info
f_game = line
else: # other lines contain coordinates of the pieces
f_pieces += [line]
n += 1 # increment number of lines... n-1 == number of pieces
f.close() # close the file... only if the file was opened...
# validating the format of the first line
try:
temp1 = int(f_game[0])
temp2 = int(f_game[2])
temp3 = int(f_game[4])
temp4 = int(f_game[6])
temp5 = int(f_game[8])
f_game = [temp1, None, temp2, None, temp3, None, temp4, None, temp5]
except ValueError:
pass # display error message... bad format
for i in f_pieces: # iterate on the list that contains information about pieces
try:
i1 = int(i[0])
i2 = int(i[1])
except ValueError: # bad coordinates... piece is put outside the board
i1 = 8
i2 = 8
if i[2] == "T": # rook
if i[3] == "B": # white
if f_game[2] != 0 and i1 == 0 and i2 == 7: # short white roc is possible... this is the right rook, too
did_first_move = False
elif f_game[4] != 0 and i1 == 0 and i2 == 0: # long white roc is possible... and this is the right rook, too
did_first_move = False
else: # it is not one a rook implied ina possible roc
did_first_move = True
tb += 1 # increment the amount of this piece by 1
globals()["tb" + str(tb)] = Rook.Rook(0, i1, i2, did_first_move) # from the import Rook... which contains class Rook with its initializer that takes 4 args (color, line, column, first_move)
if i1 < 8 and i2 < 8: # if the coordinates are valid...
d[(i1, i2)] = globals()["tb" + str(tb)] # add it to the board dictionary... key is a tuple... element is a Piece.Piece class
else: # black...Rook still
if f_game[6] != 0 and i1 == 7 and i2 == 7: # short black roc possible... this is the right rook, too
did_first_move = False
elif f_game[8] != 0 and i1 == 7 and i2 == 0: # long black roc possible... this is the right rook, too
did_first_move = False
else: # the rook is not implied in a possible roc
did_first_move = True
tn += 1 # increment piece type
globals()["tn" + str(tn)] = Rook.Rook(1, i1, i2, did_first_move) # once again... from the import that takes 4 args
if i1 < 8 and i2 < 8: # if the coordinates are valid...
d[(i1, i2)] = globals()["tn" + str(tn)] # put it in the board dictionary
elif i[2] == "C": # Knight
if i[3] == "B": # white
cb += 1 # increment
globals()["cb" + str(cb)] = Knight.Knight(0, i1, i2) # from the import... not it takes 3 or 4 args... the last one being optional... as wether a Knight did their first move of not is irrelevant... it is not needed to pass a 4th arg
if i1 < 8 and i2 < 8: # if the coordinates are valid...
d[(i1, i2)] = globals()["cb" + str(cb)] # put it in the board dictionary
else: # black
cn += 1 # increment
globals()["cn" + str(cn)] = Knight.Knight(1, i1, i2) # create class instance from import...
if i1 < 8 and i2 < 8: # if the coordinates are valid...
d[(i1, i2)] = globals()["cn" + str(cn)] # put it in the board dictionary
elif i[2] == "F": # Bishop
if i[3] == "B": # white
fb += 1 # increment
globals()["fb" + str(fb)] = Bishop.Bishop(0, i1, i2) # create class instance from import...
if i1 < 8 and i2 < 8: # if the coordinates are valid...
d[(i1, i2)] = globals()["fb" + str(fb)] # put it in the board dictionary
else: # black
fn += 1 # increment
globals()["fn" + str(fn)] = Fou.Fou(1, i1, i2) # create class instance from import...
if i1 < 8 and i2 < 8: # if the coordinates are valid...
d[(i1, i2)] = globals()["fn" + str(fn)] # put it inside the board dictionary
elif i[2] == "D": # Queen
if i[3] == "B": # white
db += 1 # increment
globals()["db" + str(db)] = Queen.Queen(0, i1, i2) # create class instance from import...
if i1 < 8 and i2 < 8: # if coordinates are valid...
d[(i1, i2)] = globals()["db" + str(db)] # put it in the board dictionary
else: # black
dn += 1 # increment
globals()["dn" + str(dn)] = Queen.Queen(1, i1, i2) # create class instance from import...
if i1 < 8 and i2 < 8: # if the coordinates are valid...
d[(i1, i2)] = globals()["dn" + str(dn)] # put it inside the board dictionary
elif i[2] == "R": # King
if i[3] == "B": # white
if f_game[2] != 0 or f_game[4] != 0: # white king did not perform its first move
did_first_move = False
else: # white king did move
did_first_move = True
rb += 1 # increment
globals()["rb" + str(rb)] = King.King(0, i1, i2, did_first_move) # create class instance from the import...
pos_r0 = (i1, i2)
if i1 < 8 and i2 < 8: # if coordinates are valid...
d[(i1, i2)] = globals()["rb" + str(rb)] # put it inside the board dictionary
else: # black
if f_game[6] != 0 or f_game[8] != 0: # black king did not perform its first move
did_first_move = False
else: # black king did move
first = True
rn += 1 # increment
globals()["rn" + str(rn)] = King.King(1, i1, i2, did_first_move) # create class instance from import...
pos_r1 = (i1, i2)
if i1 < 8 and i2 < 8: # if the coordinates are valid...
d[(i1, i2)] = globals()["rn" + str(rn)] # put it in the board dictionary
else: # pawn
if i[3] == "B": # white
if i1 == 1: # the pawn is still at its starting position
did_first_move = False
else: # the pawn moved from its starting position
did_first_move = True
pb += 1 # increment
globals()["pb" + str(pb)] = Pawn.Pawn(0, i1, i2, did_first_move) # create class instance from import
if i1 < 8 and i2 < 8: # if coordinates are valid...
d[(i1, i2)] = globals()["pb" + str(pb)] # put it in the board dictionary
else: # black
if i1 == 1: # the pawn is still at its starting position
did_first_move = False
else: # the pawn moved from its starting position
did_first_move = True
pn += 1 # increment
globals()["pn" + str(pn)] = Pawn.Pawn(0, i1, i2, prem_depl) # create class instance from import...
if i1 < 8 and i2 < 8: # if coordinates are valid...
d[(i1, i2)] = globals()["pn" + str(pn)] # put it in the board dictionary
# create the board class instance from import... which only takes 1 arg... the board itself (dict)
b = Board.Board(d)
# create the game (GameManagement class instance... from import)
# it takes 3 optional args... number of turns since the start of the game, position of white king and position of black king...
g = GameManagement.GameManagement(f_game[0], pos_r0, pos_r1)
return g, b
编辑:哈。非常感谢,我被迭代错误困住了,当我花了一个多小时查看所有可能导致迭代错误的东西时,我什至没有找到它。
这只是返回语句的标识。
最佳答案
我猜想问题出在最后一行,应该缩进(将缩进减少一级)。在您当前的代码中,当找不到文件时,该函数将返回 None
。并且您的 NoneType
错误可能发生在使用此函数输出的代码上。
尝试减少返回声明的缩进。
编辑:
看到你的回溯,这个问题被确认是错误,因为它无法将 None
解包到 game1
和 board1
关于python NoneType 对象不可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20041012/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!