Python 2.7 vs 3.5 中的类型转换,如何使我的 2.7 代码在 3.5 下工作?
Type conversion in Python 2.7 vs 3.5, how to make my 2.7 code work under 3.5?
我正在将 2.7 代码移植到 3.5,2.7 代码工作正常。 运行 2to3 并更改旧代码中的 obvious 之后,我仍然收到以下错误消息:
Exception in thread Thread-7:
Traceback (most recent call last):
File "C:\Users\Anaconda3\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Users\Anaconda3\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "<ipython-input-2-eadc3d59ae9f>", line 70, in receiveData
nftp = self.parseNFTPData(stringBuffer(data[:-1]))
File "<ipython-input-2-eadc3d59ae9f>", line 101, in parseNFTPData
current_string += c
TypeError: Can't convert 'int' object to str implicitly
我理解错误,但为什么在 Python 3 而不是 2 下会出现此错误?在我看来,这是一个语法问题?!?
代码如下:
def parseNFTPData(self, strbuf):
quote = False
result = []
current_string = ""
while not strbuf.eof():
c = strbuf.read()
if c == "\"":
if quote:
quote = False
else:
quote = True
elif c == "(" and not quote:
list = self.parseNFTPData(strbuf)
result.append(list)
elif c == ")" and not quote:
result.append(self.typeConvert(current_string))
strbuf.read()
return result
elif len(current_string) > 0 and c == " " and not quote:
result.append(self.typeConvert(current_string))
current_string = ""
else:
current_string += c
if len(current_string) > 0:
result.append(self.typeConvert(current_string))
return result
'strbuf' 属于 class stringBuffer:
class stringBuffer:
def __init__(self, string):
self.buffer = string
self.readptr = 0
def read(self):
if self.readptr < len(self.buffer):
readc = self.buffer[self.readptr]
self.readptr += 1
else:
readc = False
return readc
def eof(self):
if self.readptr >= len(self.buffer):
return True
else:
return False
def peek(self):
return self.buffer[self.readptr]
这可能有效current_string += str(c)
current_string += c
在 Python 2.7 和 3.5 中都不起作用,如果 type(current_string) == str and type(c) == int
。 Python 从来不允许直接连接字符串和整数。您可能需要在 Python 2.7 中检查您的原始代码以找到确切的问题,或者如果您愿意,可以在此处 post 您的原始代码。
仅供参考,current_string += str(c)
将解决您当前面临的错误。
最可能的原因是 strbuf
的行为不同。在 2.7 中,strbuf.read()
可能返回一个字符,而在 3.5 中它返回一个 int。
我怀疑这与所做的 Unicode 更改有关。 strbuf 类似于 3.5 中的字节字符串吗?
我正在将 2.7 代码移植到 3.5,2.7 代码工作正常。 运行 2to3 并更改旧代码中的 obvious 之后,我仍然收到以下错误消息:
Exception in thread Thread-7:
Traceback (most recent call last):
File "C:\Users\Anaconda3\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Users\Anaconda3\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "<ipython-input-2-eadc3d59ae9f>", line 70, in receiveData
nftp = self.parseNFTPData(stringBuffer(data[:-1]))
File "<ipython-input-2-eadc3d59ae9f>", line 101, in parseNFTPData
current_string += c
TypeError: Can't convert 'int' object to str implicitly
我理解错误,但为什么在 Python 3 而不是 2 下会出现此错误?在我看来,这是一个语法问题?!?
代码如下:
def parseNFTPData(self, strbuf):
quote = False
result = []
current_string = ""
while not strbuf.eof():
c = strbuf.read()
if c == "\"":
if quote:
quote = False
else:
quote = True
elif c == "(" and not quote:
list = self.parseNFTPData(strbuf)
result.append(list)
elif c == ")" and not quote:
result.append(self.typeConvert(current_string))
strbuf.read()
return result
elif len(current_string) > 0 and c == " " and not quote:
result.append(self.typeConvert(current_string))
current_string = ""
else:
current_string += c
if len(current_string) > 0:
result.append(self.typeConvert(current_string))
return result
'strbuf' 属于 class stringBuffer:
class stringBuffer:
def __init__(self, string):
self.buffer = string
self.readptr = 0
def read(self):
if self.readptr < len(self.buffer):
readc = self.buffer[self.readptr]
self.readptr += 1
else:
readc = False
return readc
def eof(self):
if self.readptr >= len(self.buffer):
return True
else:
return False
def peek(self):
return self.buffer[self.readptr]
这可能有效current_string += str(c)
current_string += c
在 Python 2.7 和 3.5 中都不起作用,如果 type(current_string) == str and type(c) == int
。 Python 从来不允许直接连接字符串和整数。您可能需要在 Python 2.7 中检查您的原始代码以找到确切的问题,或者如果您愿意,可以在此处 post 您的原始代码。
仅供参考,current_string += str(c)
将解决您当前面临的错误。
最可能的原因是 strbuf
的行为不同。在 2.7 中,strbuf.read()
可能返回一个字符,而在 3.5 中它返回一个 int。
我怀疑这与所做的 Unicode 更改有关。 strbuf 类似于 3.5 中的字节字符串吗?