2012-12-31 28 views
5

呃,我已經準備好使用的代碼了,我確定它確實有效,但我得到以下錯誤:Python - 描述符'split'需要一個'str'對象,但收到一個'unicode'

TypeError: descriptor 'split' requires a 'str' object but received a '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」,但嗯。等待意見:)

+2

「我敢肯定,這確實有效,但我得到以下錯誤」 .. UMN,所以你實際上肯定沒有關係」工作,因爲好,它真的沒有? – Voo

+0

你可能會考慮使用'struct'模塊來代替。 – Keith

回答

9

問題是str.splitstr類的一種方法,但正在調用unicode類的對象。用ipSplit = self.serverVars[0].split('.')直接調用該方法,使其適用於任何事物(包括strunicode),並使用split方法。

+0

是的,我打電話給方法,它工作。謝謝! –

+0

我不明白爲什麼這是一個問題。當我運行此代碼時,它工作正常:>>> u'a.b'.split('。')===>結果是: [u'a',u'b'] – damzam

+0

@DavidMorton是,你發佈的代碼應該可以正常工作。問題出在'str.split(u'a.b','。')'。 –

12

正如@Abe提到的,這裏的問題是,您正在使用str.split拆分導致失敗的unicode類型的對象。

有三個選項供您

  1. 在這種特殊情況下,你可以簡單地調用該對象的split()方法。這將確保不管對象的類型(str,unicode),方法調用都會正確處理它。
  2. 您也可以致電unicode.split()。這將適用於unicode字符串,但對於non-unicode字符串,這將再次失敗。
  3. 最後,您可以導入string模塊並調用string.split函數。此函數將split()函數調用轉換爲方法調用,因此無論對象類型如何,都可透明地調用split()。這是有益的,當你正在使用的split()作爲回調尤指功能,如map()
+0

是的,它與第一個選項合作,我稱之爲方法。無論如何謝謝你! –

+0

第三個選項對我很有用。我傾向於使用相當多的函數式編程風格。儘管有pylint警告,還有一個使用字符串模塊的理由。 – bli

相關問題