Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

4,088 views

Published on

Python3.6の新機能紹介

Published in: Software
  • Login to see the comments

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 続きはこちら

×