10

呃,我有现成的代码,我确信它确实有效,但我收到以下错误:

TypeError:描述符“split”需要一个“str”对象但收到一个“unicode”

这就是整个定义:

def assemblePacket(self, type):
    ipSplit = str.split(self.serverVars[0], '.')

    packet = 'SAMP'
    packet += chr(int(ipSplit[0]))
    packet += chr(int(ipSplit[1]))
    packet += chr(int(ipSplit[2]))
    packet += chr(int(ipSplit[3]))
    packet += chr(self.serverVars[1] & 0xFF)
    packet += chr(self.serverVars[1] >> 8 & 0xFF)
    packet += type

    return packet

这就是问题所在:

ipSplit = str.split(self.serverVars[0], '.')

我确定这不是因为代码,我之前尝试过(相同的脚本)并且它有效。不知道为什么现在没有。这个“unicode”让我觉得我必须改变“str.split”,但是嗯。等待意见:)

4

3 回答 3

15

正如@Abe 提到的,这里的问题是,您正在使用str.split来拆分unicode导致失败的类型的对象。

三个选项供您选择

  1. 在这种特殊情况下,您可以简单地调用split()对象的方法。这将确保无论对象 ( str, unicode) 的类型如何,方法调用都会正确处理它。
  2. 您也可以调用unicode.split(). 这适用于unicode字符串,但对于non-unicode字符串,这将再次失败。
  3. 最后,您可以导入字符串模块并调用string.split函数。此函数将split()函数调用转换为方法调用,因此split()无论对象类型如何,您都可以透明地调用。当您将split()as 回调 esp 用于类似的函数时,这很有用map()
于 2012-12-31T07:56:55.330 回答
12

问题是这str.splitstr类的方法,但正在为unicode类的对象调用。直接调用该方法,ipSplit = self.serverVars[0].split('.')使其适用于任何具有方法的东西(包括strand unicodesplit

于 2012-12-31T07:14:23.813 回答
0

使用isdigit. 如果您处于类似的解决方案中,您可以尝试类似的try-except

try:
    output += filter(str.isdigit, some_string)
except TypeError:
    output += filter(unicode.isdigit, some_string)
于 2018-10-19T10:41:22.417 回答