Pythonの次の大きなマイルストンとなるバージョン3.6が間近になった。12月16日のリリースが予定されるPython 3.6では,より高速かつコンパクトになったディクショナリ,改良されたasyncio
,新しくなったファイルシステムパスプロトコルなど,数多くの新機能が提供される。
Python 3.6ではdict
型が改良されて,Python 3.5に比較してメモリ使用量が20%少なくなった。これはPyPyと同様の実装を新たに導入して実現したもので,ガベージコレクションのパフォーマンスも同時に改善されている。
新リリースでは,サブクラス生成時にベースクラスでコールされる__init_subclass__
クラスメソッドを新たに導入したことで,サブクラス生成のカスタマイズもこれまでより容易になった。
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
この新しいメカニズムは,ベースクラス生成をカスタマイズする既存のmetaclassに対する,より使いやすい代替機能であると解釈できる。
標準ライブラリに目を移すと,言及に値する改良ないし新規モジュールがいくつもある – asyncio
モジュールが暫定ではなくなり,APIも安定版と見なされるようになった。アカウント認証やトークンなどで使用する,暗号強度の高い擬似ランダム値を高い信頼性で生成するsecrets
モジュールが新たに提供された。さらにはタイプヒントの指定をサポートするtypingモジュールも,安定版と宣言されている。
その他の新機能は次のようなものだ。
-
次の例に示すような文字列リテラルの補間による,文字列リテラルのフォーマットが可能になった。
>>> name = "Fred" >>> f"He said his name is {name}." 'He said his name is Fred.' >>> width = 10 >>> precision = 4 >>> value = decimal.Decimal("12.34567") >>> f"result: {value:{width}.{precision}}" # nested fields 'result: 12.35'
-
数値リテラルにアンダースコアを加えて,次のような記述が可能になった。
>>> 1_000_000_000_000_000 1000000000000000 >>> 0x_FF_FF_FF_FF 4294967295
-
await
とasync
が同じ関数本体で使用できないという制限を取り除くことによって可能になった,非同期ジェネレータ。async def ticker(delay, to): """Yield numbers from 0 to *to* every *delay* seconds.""" for i in range(to): yield i await asyncio.sleep(delay)
-
次の例に示すような非同期内包。
result = [i async for i in aiter() if i % 2]
Python 3.6の新機能および改良された機能の全リストは,what’s new資料で確認できる。
この記事を評価
- 編集者評
- 編集長アクション