Python - 描述符'split'需要一个'str'对象但是收到'unicode'

Tom*_*ins 10 python

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

TypeError:描述符'split'需要'str'对象但收到'unicode'

这就是整个def:

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
Run Code Online (Sandbox Code Playgroud)

这是问题所在:

ipSplit = str.split(self.serverVars[0], '.')
Run Code Online (Sandbox Code Playgroud)

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

Abh*_*jit 16

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

有三种选择

  1. 在这种特殊情况下,您只需调用split()该对象的方法即可.这将确保无论对象(str,unicode)的类型如何,方法调用都将正确处理它.
  2. 你也可以打电话unicode.split().这适用于unicode字符串,但对于non-unicode字符串,这将再次失败.
  3. 最后,您可以导入字符串模块并调用string.split函数.此函数将split()函数调用转换为方法调用,从而使您可以透明地调用split()对象类型.当你使用split()as回调esp函数时,这是有益的map()

  • 第三种选择对我有用.我倾向于使用相当多的函数式编程风格.尽管有pylint警告,还有一个使用字符串模块的原因. (3认同)

Abe*_*lus 12

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