2012-12-31 18 views
5

Erm, tôi đã sẵn sàng sử dụng và tôi chắc chắn nó thực sự hoạt động, nhưng tôi gặp lỗi sau:Python - Mô tả 'tách' yêu cầu đối tượng 'đường' nhưng nhận được 'unicode'

TypeError: descriptor 'split' requires a 'str' object but received a 'unicode'

đó là toàn bộ 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 

Và đây là vấn đề:

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

tôi chắc chắn rằng nó không phải vì mã này, tôi đã cố gắng đó là fore (cùng một kịch bản) và nó hoạt động. Không có ý tưởng tại sao nó không now.And này "unicode" làm cho tôi nghĩ rằng tôi phải thay đổi "str.split", nhưng hmmm. Đang chờ ý kiến ​​:)

+2

"Tôi chắc chắn nó thực sự hoạt động, nhưng tôi gặp lỗi sau" .. nên bạn thực sự chắc chắn rằng nó không ' t làm việc, bởi vì, nó thực sự không? – Voo

+0

Bạn có thể xem xét sử dụng mô-đun 'struct' để thay thế. – Keith

Trả lời

9

Vấn đề là str.split là phương pháp của lớp str, nhưng đang được gọi cho đối tượng của lớp unicode. Gọi phương thức trực tiếp với ipSplit = self.serverVars[0].split('.') để nó hoạt động cho bất kỳ thứ gì (bao gồm strunicode) với phương thức split.

+0

Có, tôi đã gọi phương thức và nó đã hoạt động. Cảm ơn bạn! –

+0

Tôi không hiểu tại sao đây là vấn đề. Khi tôi chạy mã này, nó hoạt động tốt: >>> u'a.b'.split ('.') ===> Kết quả là: [u'a ', u'b'] – damzam

+0

@DavidMorton Có , mã bạn đăng sẽ hoạt động tốt. Vấn đề là với 'str.split (u'a.b ','. ')'. –

12

Như đã đề cập, vấn đề ở đây là, bạn đang sử dụng str.split để chia đối tượng thuộc loại unicode gây ra lỗi.

Có ba lựa chọn cho bạn

  1. Trong trường hợp này, bạn có thể chỉ đơn giản là gọi phương thức split() cho đối tượng. Điều này sẽ đảm bảo rằng không phân biệt loại đối tượng (str, unicode), cuộc gọi phương thức sẽ xử lý đúng đối tượng.
  2. Bạn cũng có thể gọi unicode.split(). Điều này sẽ hoạt động tốt cho chuỗi unicode nhưng đối với chuỗi non-unicode, điều này sẽ không thành công nữa.
  3. Cuối cùng, bạn có thể nhập mô-đun string và gọi hàm string.split. Hàm này chuyển đổi cuộc gọi hàm split() thành gọi phương thức, do đó cho phép bạn gọi một cách rõ ràng split() bất kể loại đối tượng. Điều này có lợi khi bạn đang sử dụng split() làm gọi lại cho các chức năng như map()
+0

Vâng, nó đã làm việc với tùy chọn đầu tiên, tôi gọi phương thức này. Dù sao cũng cảm ơn bạn! –

+0

Tùy chọn thứ ba hữu ích cho tôi. Tôi có xu hướng sử dụng khá một số phong cách lập trình chức năng. Một lý do nữa để sử dụng mô-đun chuỗi mặc dù cảnh báo pylint. – bli

Các vấn đề liên quan