Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

2019年10月に正式版が公開されるPython 3.8について紹介します

f:id:kenken0326:20190807154359p:plain

こんにちはPyQチームです。

Python 3.8が10月にリリースされます。Python 3.8にはどんな機能が追加されるのでしょうか?
今回は、Python 3.8の新要素について先取り情報を紹介します。

リリース予定

Python3.8.0は、2019年8月26日時点でbeta版(beta3)がリリースされています。正式版までのリリース予定は以下のようになっています。 ( candidate というのは「正式版になる予定のバージョン」のことです)

  • 2019年9月30日: Python 3.8.0 candidate 1
  • 2019年10月7日: Python 3.8.0 candidate 2(必要があればリリース)
  • 2019年10月21日: Python 3.8.0 final(正式版)

Python 3.8リリースについてはPEP 569で定義されています。 https://www.python.org/dev/peps/pep-0569/

それではPython 3.8での新要素を順に見ていきましょう。ここではとくに注目したい3つの新要素「Assignment Expressions」「Positional-only arguments」「f-strings support a handy = specifier for debugging」を取り上げます。

1: Assignment Expressions

Assignment Expressionsは新たな代入演算子です。:=で表されます。 その見た目からwalrus operator(セイウチ演算子)とも呼ばれます。 「どこが似てるの?」と思われた方は:=を横から見てください。セイウチみたいに見えませんか?

いらすとや-セイウチ

https://4.bp.blogspot.com/-PzYXnVl0iqQ/Vyccu8RU8vI/AAAAAAAA6R8/qDBUnD7uoZssGh0DIgZ4Bv7Ndy8rHpFMACLcB/s800/animal_seiuchi2.png

Assignment Expressionsを使うと、変数への値の代入と評価を同時に行えます。

サンプルコード

以下の例では、変数nlen(a)の戻り値を代入すると同時に、 if n > 10 を評価しています。

a = list(range(11))  # 要素数11のリスト
if (n := len(a)) > 10:
    print(f"リストが長すぎます。 ({n} 個の要素, 期待される要素数 <= 10)")

代入演算子を使わない従来の書き方ではこのようになります。

a = list(range(11))  # 要素数11のリスト
n = len(a)
if n > 10:
    print(f"リストが長すぎます。 ({n} 個の要素, 期待される要素数 <= 10)")

使用例

文字列に正規表現r'Python (?P<version>[\d\W]+)'が含まれているかを検索して、含まれている場合は名前付きグループversionを表示します。

>>> import re
>>> pat = re.compile(r'Python (?P<version>[\d\W]+)')
>>> py = 'Python 3.8.0'
>>> if s := pat.search(py):
...     print(s.group('version'))
...
3.8.0
>>> rb = 'Ruby 2.6.3'
>>> if s := pat.search(rb):
...     print(s.group('version'))
...

これも従来は代入と評価の行を分ける必要がありました。

s = pat.search(py)
if s:
    print(s.group('version'))

Assignment Expressionsは便利な反面、どこで値を代入しているのかを見落としてしまう可能性もあります。条件式が複雑な場合には従来の書き方をするなど、使い分けが重要になりそうです。

Assignment ExpressionsはPEP 572で定義されています。詳細はPEPをご覧ください。

www.python.org

2: Positional-only arguments

Positional-only argumentsは/ で表します。/ の前にある引数はすべて位置引数であると指定する構文です。

たとえば以下の pow 関数の場合では pow(2, 10) pow(2, 10, 17) は正しく処理されますが(サンプルコード1)、 pow(x=2, y=10)pow(2, 10, z=17) ではエラーが発生します(サンプルコード2)。

サンプルコード1

def pow(x, y, z=None, /):
    r = x**y
    if z is not None:
        # rとzの余剰を求める
        r %= z
    return r

サンプルコード2

pow(2, 10, z=17)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pow() got some positional-only arguments passed as keyword arguments: 'z'

/の後の引数がキーワード引数として確認する

以下のようにキーワード引数zの前に/を書いた場合はzをキーワード引数として指定できます。

def pow(x, y, /, z=None):
    r = x**y
    if z is not None:
        # rとzの余剰を求める
        r %= z
    return r
pow(2, 10, z=17)
4

Positional-only argumentsはPEP 570で定義されています。詳細はPEPをご覧ください。

www.python.org

3: f-strings support a handy = specifier for debugging

Python 3.6から追加されたf-stringsについての変更です。

>>> version = 3.8
>>> print(f'Python {version}')
Python 3.8

今回の変更ではf-stringsの末尾に=をつけて、f'{式 = }' の形にすることで式が評価されるようになりました。式とその結果の確認が簡単に行えます。

サンプルコード

>>> x = 3
>>> print(f'式: {x*9 + 15 = }')
式: x*9 + 15 = 42
>>> f'{x is not None = }'
'x is not None = True'
>>> y = None
>>> f'{y is not None = }'
'y is not None = False'

これまでは式とその答えをf-stringsで表示するには以下のようにする必要がありました。

>>> print(f'式: x*9 + 15 = {x*9 + 15}')
式: x*9 + 15 = 42

今回の変更で、変数の中身や式の結果を確認するデバッグがより簡単に行えるようになるでしょう。

その他の変更

Python 3.8では今回紹介した3つの新要素以外にも、既存のモジュールなどの機能が更新、廃止されます。詳細はPython 3公式ドキュメント - What's New In Python 3.8をご覧ください。 docs.python.org

Copyright ©2017-2019 BeProud Inc. All rights reserved.