このBlogは移転しました。今後は aish.dev を御覧ください。

Python 3.8 の概要 (その7) - ちょっと便利そうな機能追加

math.prod()

リストなどのイテレータの要素の積を計算する math.prod() が追加されました。 sum() の掛け算版ですね。

>>> import math
>>> math.prod([1,2,3,4])
24

正規表現\N{名前} 記法をサポート

reモジュールで、正規表現に文字の名前を指定する \N{名前} を使えるようになりました。

>>> re.match(r'\N{LATIN SMALL LETTER A}', 'a')
<re.Match object; span=(0, 1), match='a'>
>>> re.match(r'\N{GRINNING FACE WITH SMILING EYES}', '😁')
<re.Match object; span=(0, 1), match='😁'>

文字の名前は、unicodedata.name() で調べられます。

>>> import unicodedata
>>> unicodedata.name('a')
'LATIN SMALL LETTER A'
>>> unicodedata.name('😁')
'GRINNING FACE WITH SMILING EYES'

importlib.metadataモジュール

importlib.metadata モジュールが追加され、pip でインストールされたパッケージの情報を取得できるようになりました。

>>> from importlib.metadata import *
>>> for dist in distributions():
...     print(f"{dist.metadata['Name']}: {dist.version=}")
...
chardet: dist.version='3.0.4'
pip: dist.version='19.2.3'
certifi: dist.version='2019.6.16'
idna: dist.version='2.8'
urllib3: dist.version='1.25.3'
requests: dist.version='2.22.0'
setuptools: dist.version='41.2.0'

コンテキストマネージャでProfile

cProfile.Profile() を、コンテキストマネージャとして使えるようになりました。

>>> import cProfile, pstats
>>> import urllib.request
>>> with cProfile.Profile() as pr:
...     with urllib.request.urlopen('http://www.python.org') as f:
...         print(len(f.read()))
...
48914
>>> pr.print_stats(pstats.SortKey.CUMULATIVE)
         4433 function calls (4380 primitive calls) in 0.183 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.149    0.149 request.py:139(urlopen)
      2/1    0.000    0.000    0.136    0.136 request.py:506(open)
      5/3    0.000    0.000    0.134    0.045 request.py:495(_call_chain)
        2    0.000    0.000    0.134    0.067 request.py:535(_open)
        2    0.000    0.000    0.133    0.067 request.py:1275(do_open)
        2    0.000    0.000    0.088    0.044 client.py:1218(request)
        2    0.000    0.000    0.088    0.044 client.py:1223(_send_request)
        2    0.000    0.000    0.087    0.044 client.py:1205(endheaders)
        2    0.000    0.000    0.087    0.044 client.py:995(_send_output)
        2    0.000    0.000    0.087    0.044 client.py:936(send)

コンテキストマネージャとしているのは、cProfile.Profile() のみで、profile.Profile() は使えません。気が付かないうちに、cProfileとprofileの差が大きくなっているようです。