关于字符串:在Python 2.7和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并更改旧代码中的明显代码后,我仍然会收到以下错误消息:

1
2
3
4
5
6
7
8
9
10
11
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

我确实理解这个错误,但是为什么在Python3而不是2下会出现这个错误?在我看来,这是一个语法问题????

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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"属于StringBuffer类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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]


如果type(current_string) == str and type(c) == int,那么current_string += c在python 2.7和3.5中都不工作。python从不允许直接在字符串和整数之间进行连接。您可能需要检查python 2.7中的原始代码以找到确切的问题,或者您可以根据需要在这里发布原始代码。

仅供参考,current_string += str(c)可以解决您当前面临的错误。


最可能的原因是strbuf的行为不同。在2.7中,strbuf.read()可能返回一个字符,而在3.5中,它返回一个int。

我怀疑这与所做的Unicode更改有关。strbuf是否类似于3.5中的字节字符串?


这可能会起作用。