【问题标题】:Python - Descriptor 'split' requires a 'str' object but received a 'unicode'Python - 描述符“split”需要一个“str”对象但收到一个“unicode”
【发布时间】:2012-12-31 07:11:19
【问题描述】:

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

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”,但是嗯。等待意见:)

【问题讨论】:

  • “我确定它确实有效,但我收到以下错误”.. 嗯,所以您确实确定它不起作用,因为它真的不起作用?
  • 您可以考虑改用struct 模块。

标签: python


【解决方案1】:

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

三个选项供你选择

  1. 在这种特殊情况下,您可以简单地为对象调用split() 方法。这将确保无论对象的类型(strunicode)如何,方法调用都会正确处理它。
  2. 您也可以拨打unicode.split()。这适用于unicode 字符串,但对于non-unicode 字符串,这将再次失败。
  3. 最后,您可以导入string 模块并调用string.split 函数。此函数将split() 函数调用转换为方法调用,从而使您能够透明地调用split(),无论对象类型如何。当您使用 split() 作为回调尤其是像 map() 这样的函数时,这很有用

【讨论】:

  • 是的,它适用于第一个选项,我调用了该方法。还是谢谢你!
  • 第三个选项对我很有用。我倾向于使用相当多的函数式编程风格。尽管有 pylint 警告,仍然使用字符串模块的另一个原因。
【解决方案2】:

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

【讨论】:

  • 我不明白为什么这是个问题。当我运行这段代码时,它工作正常: >>>u'a.b'.split('.') ===> 结果是: [u'a', u'b']
  • @DavidMorton 是的,您发布的代码应该可以正常工作。问题在于str.split(u'a.b', '.')
【解决方案3】:

使用isdigit 时,这两种方法都不起作用。如果您处于类似的解决方案中,您可以尝试类似的try-except

try:
    output += filter(str.isdigit, some_string)
except TypeError:
    output += filter(unicode.isdigit, some_string)

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多