BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース ディクショナリや非同期I/Oなどが改善されたPython 3.6

ディクショナリや非同期I/Oなどが改善されたPython 3.6

原文(投稿日:2016/12/09)へのリンク

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
    
  • awaitasyncが同じ関数本体で使用できないという制限を取り除くことによって可能になった,非同期ジェネレータ

     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資料で確認できる。

 
 

この記事を評価

関連性
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT