Python 3.6 リリースパーティー 発表資料

1,535 views

Published on

Python3.6の新機能紹介

Published in: Software
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,535
On SlideShare
0
From Embeds
0
Number of Embeds
1,172
Actions
Shares
0
Downloads
7
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Python 3.6 リリースパーティー 発表資料

  1. 1. What's new in Python 3.6 2017/1/31 Python 3.6 リリースパーティー Atsuo Ishimoto
  2. 2. 自己紹介 2 石本 敦夫 フリーランスのプログラマ python.jp の管理人 著書 Pythonライブラリ厳選レシピ Python文法詳解 パーフェクトPython
  3. 3. Python 3.6 2016年12月23日リリース 3
  4. 4. PEP 498: formatted string literals 4 >>> a=1; b=2; >>> f'{a}+{b}は{a+b}' '1+2は3' フォーマット済み文字列
  5. 5. f文字列の書き方 5 fで始まる文字列はf文字列 >>> f'{a}+{b}は{a+b}' '1+2は3' >>> F'''Fでも{"OK"}''' 'FでもOK'
  6. 6. 式の書き方 6 f'{式}' >>> f'2π={math.pi*2}' '2π=6.283185307179586'  ほとんどの式を書ける  yield/yield from もOK  awaitは駄目(Bugらしい)
  7. 7. 7 f"""{f'''{f"{f'{x}'}"}'''}""" • 式内の文字定数では、バックスラッシュ によるエスケープができない f-string中の文字列リテラル >>> f'{"t"}INDENTED' File "<stdin>", line 1 SyntaxError: f-string expression part cannot include a backslash • よってf-stringのネストはこれが限界
  8. 8. 8 lambdaはエラーになる >>> f'{lambda :1}' File "<fstring>", line 1 (lambda ) ^ SyntaxError: unexpected EOF while parsing カッコで囲めばOK >>> f'{(lambda :1)}' '<function <lambda> at 0x102cc4e18>'
  9. 9. 書式指定文字列の書き方 9 >>> f'{2/1!r:*^11s}' '****2.0****' f'{式!変換指定:書式指定}' • '{}'.format(…) の書式指定と同じ
  10. 10. 書式指定に式を指定 10 >>> width = 10 >>> f'{999:#<{width*2}d}' '999#################'
  11. 11. f-stringのしくみ 11 0 LOAD_CONST 1 ('C=') 2 LOAD_GLOBAL 0 (A) 4 LOAD_GLOBAL 1 (B) 6 BINARY_ADD 8 LOAD_CONST 2 ('5d') 10 FORMAT_VALUE 4 (with format) 12 BUILD_STRING 2 14 POP_TOP 16 LOAD_CONST 0 (None) 18 RETURN_VALUE def f(): f'C={A+B:5d}'
  12. 12. f-stringを式に変換 12 S = f'C={A+B:5d}' S = 'C=' + (A+B).__format__('5d')
  13. 13. パフォーマンスは? 13 f'{a:10}{b:10}{c:10}' v.s. '{a:10}{b:10}{c:10}'.format( a=a,b=b,c=c) ishimoto@MacBook-Air:~$ python3 -m timeit "a,b,c=100,200,300;f'{a:10}{b:10}{c:10}'" 1000000 loops, best of 3: 1.56 usec per loop ishimoto@MacBook-Air:~$ python3 -m timeit "a,b,c=100,200,300;'{a:10}{b:10}{c:10}'.format(a=a,b=b,c =c)" 1000000 loops, best of 3: 1.55 usec per loop
  14. 14. PEP 515 underscores in numeric literals. 14 数字リテラルに桁区切りを追加 1234567890 → 1_234_567_890 0xaabbccdd → 0x_aa_bb_cc_dd 0b00001111 → 0b0000_1111
  15. 15. PEP 487: Simpler customization of class creation 15 手軽にクラスオブジェクトのカスタマイズ # カスタマイズの例 class Color(Enum): RED=1 GREEN=2 Color.REDは、自動 的にenumオブジェク トに置き換えられる  クラス定義時に、自動的な機能追 加、検証などを行う
  16. 16. メタクラス 16  クラスオブジェクトを作成するオブ ジェクト  クラスを定義するとき、使用するメ タクラスを指定できる  クラスの生成をカスタマイズできる 「クラスのクラス」
  17. 17. メタクラスの問題点 17 Pythonの型システムや、ク ラスオブジェクトの構造を理 解しなければならない 複数のメタクラスを組み合 わせられない
  18. 18. 新しいカスタマイズ手法 18  メタクラスを使わずにカスタマイズ できる  複数のカスタマイズを同時に適用 できる
  19. 19. __init_subclass__() 19 派生クラスが作成されると呼び出される class Base: # 自動的に classmethod となる def __init_subclass__(cls, kwargs): super().__init_subclass__(kwargs) class Derived(Base):pass
  20. 20. __set_name__() メソッド 20 クラス属性に、クラスと属性名を通知する class Now: def __set_name__(self, cls, name): setattr(cls, name, datetime.now()) class Spam: # Spam.createdは現在時刻となる created = Now()
  21. 21. 属性の登録順 21 クラスの__dict__は、登録順を記録する class C: FIRST = 1 SECOND = 2 THIRD = 3 # 常に一定の順番で要素名を出力する for name in C.__dict__:print(name)
  22. 22. PEP 506: Adding A Secrets Module To The Standard Library 22 新規モジュール "secrets" セキュリティ上、利用しても安全な乱 数やトークン生成を提供する 独自に random モジュールなどを 使っても実装できるが、それには正し い知識が必要
  23. 23. PEP 495: Local Time Disambiguation datetime.time/datetime.datetimeオ ブジェクトに、fold属性を追加 ex) d=datetime.datetime( 2017,1,31,0,0,fold=1) fold属性は、その時間が「何回目だっ たか」を表す。 23
  24. 24. 24 協定世界時(UTC) 東部標準時(EST) fold 2017/11/5 4:00 2017/11/5 00:00 0 5:00 01:00 0 5:30 01:30 0 6:00 01:00 1 6:30 01:30 1 夏時間終了 例: アメリカ東部時間の夏時間終了日
  25. 25. PEP 519: Adding a file system path protocol 25 open()/os.stat() など、ファイル 名を引数として渡す関数に、文字列と バイト列以外のオブジェクトを渡せる ようになった pathlib.Pathなどの、ファイル名として 使えるPathLikeオブジェクトは、 __fspath__()メソッドを実装する
  26. 26. __fspath__()メソッドの例 26 class EnvPath: def __init__(self, env): self._env = env def __fspath__(self): return os.environ[self._env] home = EnvPath('HOME') print(os.stat(home))
  27. 27. PEP 528: Change Windows console encoding to UTF-8 27 Windowsのコンソールで € を  Windowsで、コンソールへの入出力が Unicodeで行われるようになった  従来はcp932(ShiftJIS)などの文字 セットで、最低限の日本語入出力しか 行えなかった。
  28. 28. SJIS以外の文字も表示できる 28 >>> print('N{EURO SIGN}') € Python3.6 Python3.5まで >>> print('N{EURO SIGN}') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'cp932' codec can't encode…
  29. 29. 29 ※ただしコンソールに限る C:> python.exe -c "print('u20ac')" € C:> python.exe -c "print('u20ac')" > NUL Traceback (most recent call last): File "<string>", line 1, in <module> UnicodeEncodeError: 'cp932' codec can't encode character 'x20ac' in position 0: illegal multibyte sequence 入出力をリダイレクトした場合は従来通り
  30. 30. 30 仕組み print('aeiou') sys.stdout コンソール io.FileIO ファイルAPI io._WindowsConsoleIO コンソールAPI cp932 cp932 UTF-16 UTF-8 UTF-16 UTF-16
  31. 31. PEP 529: Change Windows filesystem encoding to UTF-8 31 Windowsのバイト列ファイル名が解禁  os.listdir()のように、ファイル名に文字列 を指定した場合と、バイト列を指定した場 合で結果が異なるものがある >>> os.listdir('.') ['あ'] >>> os.listdir(b'.') [b'x82xa0']
  32. 32. 32  Windows環境では、バイト列オブジェクト をファイル名として使用するのは非推奨 となっていた  WindowsのANSI系APIは、OSの言語 設定では使用できない文字があると、す べて `?` に変換されてしまうため >>> os.listdir('.') ['€', 'あ'] >>> os.listdir(b'.') [b'?', b'x82xa0']
  33. 33. WindowsのANSI系APIを使用しない 33  Windows環境では、バイト列ファイル名 のエンコーディングは、OSの言語設定 によって決まっていた  3.6以降では、バイト列ファイル名は UTF-8に固定  バイト列をファイル名としたファイル操作 はWindowsのANSI系APIを使って実行 していたが、Unicode系APIに切り替え た
  34. 34. 34 >>> open('あ', 'w') >>> os.listdir(b'.') [b'x82xa0'] Python3.5まで Python3.6 ~ >>> os.listdir(b'.') [b'xe3x81x82']
  35. 35. ImportErrorがちょっと見やすく 35 • モジュールが見つからないければ ModuleNotFoundError 例外 が送出される • ModuleNotFoundErrorは ImportErrorの派生型 • try: ~ except ImportError: はそのままでも大丈夫
  36. 36. 36 >>> import xxx Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'xxx' >>> from sys import xxx Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: cannot import name 'xxx' モジュールが見つからないとき その他のエラー
  37. 37. 37 jsonバイト列のエンコード検出 json.loads(b'{"key":"value"}') 従来は、文字列のみ バイト列を渡すと、自動的にエンコー ディングを検出して、文字列に変換 する(※UTF-8/UTF-16/UTF-32のみ)
  38. 38. 正規表現 group参照機能の改善 38 m = re.search( '(?P<G1>P)ython', 'Python') print(m['G1']) m.group('G1')を、m['G1']と書 けるようになった
  39. 39. 正規表現 フラグの部分指定 39 r'(?i:p)ython' (?フラグ:...) で、'...' 部分 にのみフラグを適用する フラグは、i,m,s,x のいずれか (?-i)で、iフラグをオフにできる
  40. 40. PEP 628: Add math.tau 40 τ たう τ = 2π 「180度がπで360度が2π」より、「180 度が1/2τで360度が1τ」のほうがわ かりやすくない?ってことらしい。。。
  41. 41. 41 続きはこちら

×