2010-08-04 18 views
5

Tôi không chắc chắn những gì tôi đang làm sai ở đây:Python của join() sẽ không tham gia chuỗi đại diện (__str__) của đối tượng của tôi

>>> class Stringy(object): 
...  def __str__(self): 
...    return "taco" 
...  def __repr__(self): 
...    return "taco" 
... 
>>> lunch = Stringy() 
>>> lunch 
taco 
>>> str(lunch) 
'taco' 
>>> '-'.join(('carnitas',lunch)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence item 1: expected string, Stringy found 

Với bao gồm của tôi về phương pháp __str__() trong sợi dây đối tượng, không nên join() xem bữa trưa dưới dạng chuỗi?

Trả lời

7

''.join không gọi __str__ vào các mục của dãy nó tham gia. Mỗi đối tượng__str__, sau khi tất cả (chỉ được kế thừa từ object), do đó nếu join hoạt động theo cách đó, nó sẽ tham gia bất kỳ chuỗi nào (sau khi xâu chuỗi) - thường là các hiệu ứng lạ. Tốt hơn để người dùng gọi lên str một cách rõ ràng khi được bảo hành ("rõ ràng là tốt hơn là ngầm" là một trong các mottos trong "The Zen of Python", sau khi tất cả).

Bạn có thể phân loại str hoặc unicode nếu bạn muốn "là" một chuỗi. Nếu không, một cuộc gọi str rõ ràng sẽ là cần thiết để tạo các phiên bản loại "trở thành" của bạn.

1

Chữ ký cuộc gọi cho str.join là:

S.join(sequence) -> string 

Return a string which is the concatenation of the strings in the 
sequence. The separator between elements is S. 

ý rằng sequence được kỳ vọng sẽ là một chuỗi các chuỗi. Rất nhiều đối tượng có các phương thức __str__, nhưng không phải tất cả các đối tượng (như Stringy) là một phiên bản của str.

Việc sửa chữa, tất nhiên, rất đơn giản:

'-'.join(('carnitas',str(lunch))) 
12

không bạn phải chuyển nó sang str mình

'-'.join(('carnitas',str(lunch))) 

nếu bạn phải làm điều đó cho một chuỗi toàn bộ các hạng mục

'-'.join(str(x) for x in seq) 

hoặc

'-'.join(map(str, seq)) 

cho trường hợp cụ thể của bạn, bạn chỉ có thể viết

'carnitas-'+str(lunch) 
+0

+1 cho câu trả lời đúng * và * bằng cách sử dụng biểu thức trình tạo thay vì kinh khủng "hãy tạo danh sách khác vì chúng tôi hầu như không biết danh sách hiểu" :) – delnan

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