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

41
What's new in Python 3.6 2017/1/31 Python 3.6 リリリリリリリリリ Atsuo Ishimoto

Upload: atsuo-ishimoto

Post on 13-Apr-2017

2.001 views

Category:

Software


2 download

TRANSCRIPT

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

What's new in

Python 3.62017/1/31 Python 3.6 リリースパーティーAtsuo Ishimoto

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

自己紹介

2

石本 敦夫フリーランスのプログラマpython.jp の管理人著書

Python ライブラリ厳選レシピPython 文法詳解パーフェクト Python

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

3

Python 3.6 2016 年 12 月 23 日リリース

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

4

PEP 498: formatted string literals

>>> a=1; b=2;>>> f'{a}+{b} は{a+b}''1+2 は 3'

フォーマット済み文字列

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

5

f文字列の書き方fで始まる文字列はf文字列

>>> f'{a}+{b} は{a+b}''1+2 は 3'>>> F'''F でも{"OK"}''' 'F でも OK'

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

6

式の書き方f'{ 式 }' >>> f'2π={math.pi*2}''2π=6.283185307179586'

ほとんどの式を書けるyield/yield from も OKawait は駄目 (Bug らしい )

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

7

f"""{f'''{f"{f'{x}'}"}'''}"""

• 式内の文字定数では、バックスラッシュによるエスケープができない

f-string 中の文字列リテラル>>> f'{"\t"}INDENTED' File "<stdin>", line 1SyntaxError: f-string expression part cannot include a backslash

• よって f-string のネストはこれが限界

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

8

lambda はエラーになる>>> f'{lambda :1}' File "<fstring>", line 1 (lambda ) ^SyntaxError: unexpected EOF while parsing

カッコで囲めば OK>>> f'{(lambda :1)}''<function <lambda> at 0x102cc4e18>'

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

9

書式指定文字列の書き方

>>> f'{2/1!r:*^11s}''****2.0****'

f'{ 式 ! 変換指定 : 書式指定 }'

• '{}'.format(…) の書式指定と同じ

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

10

書式指定に式を指定>>> width = 10>>> f'{999:#<{width*2}d}''999#################'

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

11

f-string のしくみ

0 LOAD_CONST 1 ('C=')2 LOAD_GLOBAL 0 (A)4 LOAD_GLOBAL 1 (B)6 BINARY_ADD8 LOAD_CONST 2 ('5d')10 FORMAT_VALUE 4 (with format)12 BUILD_STRING 214 POP_TOP16 LOAD_CONST 0 (None)18 RETURN_VALUE

def f(): f'C={A+B:5d}'

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

12

f-string を式に変換S = f'C={A+B:5d}'

S = 'C=' + (A+B).__format__('5d')

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

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 loopishimoto@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

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

14

PEP 515 underscores in numeric literals.

数字リテラルに桁区切りを追加1234567890 → 1_234_567_8900xaabbccdd → 0x_aa_bb_cc_dd0b00001111 → 0b0000_1111

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

15

PEP 487: Simpler customization of class creation手軽にクラスオブジェクトのカスタマイズ

# カスタマイズの例class Color(Enum): RED=1 GREEN=2

Color.RED は、自動的に enum オブジェクトに置き換えられる

クラス定義時に、自動的な機能追加、検証などを行う

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

16

メタクラス

クラスオブジェクトを作成するオブジェクトクラスを定義するとき、使用するメタクラスを指定できるクラスの生成をカスタマイズできる

「クラスのクラス」

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

17

メタクラスの問題点Python の型システムや、クラスオブジェクトの構造を理解しなければならない複数のメタクラスを組み合わせられない

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

18

新しいカスタマイズ手法メタクラスを使わずにカスタマイズできる複数のカスタマイズを同時に適用できる

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

19

__init_subclass__()

派生クラスが作成されると呼び出されるclass Base: # 自動的に classmethod となる def __init_subclass__(cls, kwargs): super().__init_subclass__ ( kwargs)class Derived(Base):pass

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

20

__set_name__() メソッドクラス属性に、クラスと属性名を通知するclass Now: def __set_name__(self, cls, name): setattr(cls, name, datetime.now())class Spam: # Spam.created は現在時刻となる created = Now()

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

21

属性の登録順クラスの __ dict __ は、登録順を記録するclass C: FIRST = 1 SECOND = 2 THIRD = 3

# 常に一定の順番で要素名を出力するfor name in C.__dict__:print(name)

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

22

PEP 506: Adding A Secrets Module To The Standard Library

新規モジュール "secrets"

セキュリティ上、利用しても安全な乱数やトークン生成を提供する独自に random モジュールなどを使っても実装できるが、それには正しい知識が必要

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

23

PEP 495: Local Time Disambiguationdatetime.time/datetime.datetime オブジェクトに、 fold 属性を追加ex) d=datetime.datetime( 2017,1,31,0,0,fold=1)

fold 属性は、その時間が「何回目だったか」を表す。

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

24

協定世界時 (UTC) 東部標準時 (EST) fold2017/11/5 4:00 2017/11/5 00:00 0

5:00 01:00 05:30 01:30 06:00 01:00 16:30 01:30 1

夏時間終了

例 : アメリカ東部時間の夏時間終了日

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

25

PEP 519: Adding a file system path protocolopen()/os.stat() など、ファイル名を引数として渡す関数に、文字列とバイト列以外のオブジェクトを渡せるようになったpathlib.Path などの、ファイル名として使える PathLike オブジェクトは、 __fspath__() メソッドを実装する

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

26

__fspath__() メソッドの例class EnvPath: def __init__(self, env): self._env = env

def __fspath__(self): return os.environ[self._env]home = EnvPath('HOME')print(os.stat(home))

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

27

PEP 528: Change Windows console encoding to UTF-8

Windows のコンソールで € を Windows で、コンソールへの入出力が Unicode で行われるようになった 従来は cp932(ShiftJIS) などの文字セットで、最低限の日本語入出力しか行えなかった。

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

28

SJIS 以外の文字も表示できる

>>> 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…

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

29

※ ただしコンソールに限るC:\> python.exe -c "print('\u20ac')"€

C:\> python.exe -c "print('\u20ac')" > NULTraceback (most recent call last): File "<string>", line 1, in <module>UnicodeEncodeError: 'cp932' codec can't encode character '\x20ac' in position 0: illegal multibyte sequence

入出力をリダイレクトした場合は従来通り

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

30

仕組みprint('aeiou')

sys.stdout

コンソール

io.FileIO

ファイル API

io._WindowsConsoleIO

コンソール API

cp932

cp932

UTF-16

UTF-8

UTF-16

UTF-16

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

31

PEP 529: Change Windows filesystem encoding to UTF-8

Windows のバイト列ファイル名が解禁 os.listdir() のように、ファイル名に文字列を指定した場合と、バイト列を指定した場合で結果が異なるものがある>>> os.listdir('.')[' あ ']>>> os.listdir(b'.')[b'\x82\xa0']

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

32

Windows 環境では、バイト列オブジェクトをファイル名として使用するのは非推奨となっていた Windows の ANSI 系 API は、 OS の言語設定では使用できない文字があると、すべて `?` に変換されてしまうため>>> os.listdir('.')['€', ' あ ']>>> os.listdir(b'.')[b'?', b'\x82\xa0']

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

33

Windows の ANSI 系 API を使用しない Windows 環境では、バイト列ファイル名のエンコーディングは、 OS の言語設定によって決まっていた 3.6 以降では、バイト列ファイル名は

UTF-8 に固定 バイト列をファイル名としたファイル操作は Windows の ANSI 系 API を使って実行していたが、 Unicode 系

API に切り替えた

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

34

>>> open(' あ ', 'w')>>> os.listdir(b'.')[b'\x82\xa0']

Python3.5 まで

Python3.6 ~>>> os.listdir(b'.')[b'\xe3\x81\x82']

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

35

ImportError がちょっと見やすく• モジュールが見つからないければModuleNotFoundError 例外が送出される

• ModuleNotFoundError はImportError の派生型

• try: ~ except ImportError: はそのままでも大丈夫

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

36

>>> import xxxTraceback (most recent call last): File "<stdin>", line 1, in <module>

ModuleNotFoundError: No module named 'xxx'

>>> from sys import xxxTraceback (most recent call last): File "<stdin>", line 1, in <module>

ImportError: cannot import name 'xxx'

モジュールが見つからないとき

その他のエラー

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

37

json バイト列のエンコード検出json.loads(b'{"key":"value"}')

従来は、文字列のみバイト列を渡すと、自動的にエンコーディングを検出して、文字列に変換する (※UTF-8/UTF-16/UTF-32 のみ )

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

38

正規表現group参照機能の改善

m = re.search( '(?P<G1>P)ython', 'Python')print(m['G1'])

m.group('G1')を、 m['G1'] と書けるようになった

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

39

正規表現フラグの部分指定r'(?i:p)ython'

(? フラグ :...) で、 '...' 部分にのみフラグを適用するフラグは、 i,m,s,x のいずれか(?-i) で、 i フラグをオフにできる

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

40

PEP 628: Add math.tau

τたうτ = 2π「 180度が π で 360度が 2π 」より、「 180度が 1/2τ で 360度が 1τ 」のほうがわかりやすくない?ってことらしい。。。

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

41

続きはこちら