2016-10-09 8 views
1

これは私のコードです:html.unescape( "&NBSP")の探求

import os 
import html 

a = html.unescape("home - study") 
b = "test" 
print(a) 
s = (a, b) 
print(s) 

そして、これは私の結果である:

home - study 
('home\xa0-\xa0study', 'test') 

はなぜ結果は次のように印刷していますか?デフォルトでは

答えて

2

tuplesなどの印刷用コンテナ、listsなどは彼らの項目reprを使用します。 は(CPythonとでは、<container>.__str__を実装し、代わりにobject.__str__はそのスロットを埋めるせないように選ばれた。object__str__が、その後、その後the repr of the elements it containsを呼び出すに進みtuple.__repr__を呼び出します。より多くのためのPEP 3140を参照してください。)

reprを呼び出しますエスケープコード(例えば\xa0など)を持つ文字列のため、実際には、それらをエスケープしません。

print(repr(a)) 
'home\xa0-\xa0study' 

をさらに確認するために、print(s[0])を試してみてください。 オブジェクトを位置0に直接指定すると、Pythonは__str__を呼び出し、正しくヘキサをエスケープします。

+0

あなたの説明をありがとうございます。私は今の理由を理解しています。 –

+1

この回答は、動作が実装の詳細のみに起因することを暗示しているようです...これは当てはまりません。シーケンスは内部要素の表現が '__repr__'を呼び出すことで得られる' __str__'メソッドを定義することが期待されます。実装の詳細は '__str__'を' __repr__'と同じにし、明示的に '__str__'を定義することを避けることにしました。' object .__ str__'は単に '__repr__'を呼び出すからです。これを変更しようとすると[PEP](https://www.python.org/dev/peps/pep-3140/)があり、それは拒否されました。 – Bakuriu

+1

@Bakuriuそれはどういう意味か分かります。実装の詳細を進化させるものとそうでないものを明確にするために、ボディを少し修正しました。そのPEPを読んでいなかった、ありがとう! –

関連する問題