• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
String representation in py3k
 

String representation in py3k

on

  • 1,979 views

Python hackathon, Tokyo, Japan,2010

Python hackathon, Tokyo, Japan,2010

Statistics

Views

Total Views
1,979
Views on SlideShare
1,824
Embed Views
155

Actions

Likes
0
Downloads
3
Comments
0

2 Embeds 155

http://d.hatena.ne.jp 129
http://www.gembook.org 26

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    String representation in py3k String representation in py3k Presentation Transcript

    • Python 3.xのオブジェクト文字列表現 PEP-3138 STRING REPRESENTATION IN PYTHON 3000 Python Hack-a-thon 2010.07 Atsuo Ishimoto AXISSOFT Co., Ltd.
    • オブジェクト文字列表現って?  Pythonのオブジェクトを、Pythonのスクリプ トっぽい形式の文字列で表現 >>> "abc¥tdef" 'abc¥tdef' >>> datetime.datetime.now() datetime.datetime(2010, 7, 9, 13, 37, 49, 107000)  str()とは違う!str()は文字列オブジェクトへ の型変換 >>> str(datetime.datetime.now()) '2010-07-09 13:39:31.100000‘
    • 文字列表現の問題点  文字列オブジェクトをrepr()するとき、非 ASCII文字は全部エスケープされてしまう >>> "はろー" ‘¥x82¥xcd¥x82¥xeb¥x81[’ >>> open("はろー") Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: '¥x82¥xcd¥x82¥xeb¥x81[‘
    • そこでPython3では!  非ASCII文字でも、エスケープしない! >>> "はろー" 'はろー' >>> open("はろー") Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'はろー’  空白文字・印刷不能文字は従来通りエス ケープ >>> "は¥tろ¥tー" 'は¥tろ¥tー'
    • でも、楽あれば苦あり  UnicodeEncodeErrorが邪魔くさい! >>> "¥u0550" # ARMENIAN CAPITAL LETTER REH Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'cp932' codec can't encode character '¥u0550' in position 1: illegal multibyte sequence  環境によって、出力時にエラーが発生し てしまう。デバッグには不便!  例外発生時、エラーメッセージに変換不 能文字があると、本来の例外が消えてし まう
    • ascii()を使う  Python 3.0で導入された組み込み関数  Python2.xと同じ文字列を生成 >>> print(ascii("hello, はろー")) 'hello, ¥u306f¥u308d¥u30fc'
    • "backslashreplace"ハンドラを使う  変換できない文字は、例外を出さずに "¥uXXXX" に変換して出力する >>> "Hello, はろー".encode("ascii") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-9: ordinal not in range(128) "Hello, はろー".encode("ascii", "backslashreplace") b'Hello, ¥u306f¥u308d¥u30fc'
    • 標準出力・エラー出力の使い方  sys.stderrのerrorsハンドラは 'backslashreplace' >>> print(["¥u0550"], file=sys.stderr) ['¥u0550']  でも、sys.stdoutは’strict’ >>> print(["¥u0550"], file=sys.stdout) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'cp932' codec can't encode character '¥u0550' in position 2: illegal multibyte sequence
    • Errorsハンドラの設定方法  標準出力(sys.stdout)は、環境変数で設定  PYTHONIOENCODING=cp932: backslashreplace  ファイルオープン時に指定  open(filename, errors= 'backslashreplace‘)
    • なんてことを言ってますが
    • 大きな声では言えないので
    • 口に出さずに スライドにだけ 書きますが
    • 私、 Python3.x まったく 使ってません
    • 早く使えるようになるといいなぁ…
    • ……