2016-11-15 49 views
0

我将2.7代码移植到3.5中,2.7代码工作得很好。在旧代码运行2to3的和不断变化的明显后,我仍然得到以下错误消息:Python 2.7和3.5中的类型转换,如何让我的2.7代码在3.5下工作?

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' 是类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] 
+0

@Idos为什么这么说?我在问为什么以及如何在2.7和3.5中处理这个问题。我在2.7中没有错误,为什么在3.5中提出错误? – cJc

回答

1

current_string += c不会在Python 2.7 & 3.5两种工作,如果type(current_string) == str and type(c) == int。 Python从来没有直接允许字符串和整数之间的连接。您可能需要在Python 2.7中检查您的原始代码才能找到确切的问题,或者如果您愿意,可以在这里发布原始代码。

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

0

这可能会实现current_string += str(c)

+0

我会给你一个去。任何想法,但为什么这应该是必要的3而不是2? – cJc

+0

@Jason的回答有解释。 – amarnath

0

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

我怀疑这与所做的Unicode更改有关。 strbuf是3.5中的一个字节字符串吗?

+0

你可能会在这里找到一些东西。'strbuf'是类stringBuffer的。这是否更清晰? – cJc

+0

类的StringBuffer: DEF __init __(个体,字符串): self.buffer =串 self.readptr = 0 DEF读(个体): 如果self.readptr = LEN(self.buffer): 返回true else: return False def peek(self): return self.buffer [self.readptr] – cJc

+0

@cJc检查参数到'stringBuffer()'构造函数。如果2to3已将字符串更改为字节字符串,则不会感到意外 - 'stringBuffer(b“aaa”)' –

相关问题