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