【问题标题】:Type conversion in Python 2.7 vs 3.5, how to make my 2.7 code work under 3.5? [duplicate]Python 2.7 vs 3.5 中的类型转换,如何让我的 2.7 代码在 3.5 下工作? [复制]
【发布时间】:2016-11-15 08:52:13
【问题描述】:

我将 2.7 代码移植到 3.5 中,并且 2.7 代码运行良好。运行 2to3 并更改旧代码中的明显内容后,我仍然收到以下错误消息:

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]

【问题讨论】:

  • @Idos 为什么会这样?我在问为什么以及如何在 2.7 和 3.5 中以不同方式处理。即2.7没有错误,为什么3.5会出现错误?

标签: python string python-3.x type-conversion python-2.x


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这可能有效current_string += str(c)

    【讨论】:

    • 我会试一试的。知道为什么这在 3 而不是 2 中是必要的吗??
    • @Jason 的回答有解释。
    【解决方案3】:

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

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

    【讨论】:

    • 您可能在这里遇到了一些问题。'strbuf' 属于 stringBuffer 类。这样更清楚了吗??
    • class stringBuffer: def __init__(self, string): self.buffer = string self.readptr = 0 def read(self): if self.readptr = len(self.buffer): return True else: return False def peek(self) : 返回 self.buffer[self.readptr]
    • @cJc 检查stringBuffer() 构造函数的参数。如果 2to3 将您的字符串更改为字节字符串,我不会感到惊讶 - stringBuffer(b"aaa")
    • 2to3 或手动在 stringBuffer() 中没有任何改变
    猜你喜欢
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2016-02-18
    • 2017-12-17
    • 2019-09-13
    • 2016-02-24
    相关资源
    最近更新 更多