Python の__future__

Hemank Mehtani 2023年10月10日
  1. Python の print_function には __future__ を使用する
  2. Python の unicode_laterals には __future__ を使用する
  3. Python の除算には __future__ を使用する
  4. Python の absolute_import には __future__ を使用する
  5. Python の annotations には __future__ を使用してください
  6. ネストされたスコープには __future__ を使用する
  7. Python ジェネレーターには __future__ を使用する
  8. with ステートメントには __future__ を使用する
Python の__future__

__future__ は Python 2.1 で導入され、そのステートメントは Python がコードを解釈する方法を変更します。これは、将来の Python バージョンで使用できるステートメントとしていくつかのステートメントをコンパイルするようにインタープリターに指示します。つまり、Python は from __future__ import feature を使用して、より高い Python バージョンから現在のインタープリターに機能をバックポートします。

from __future__ import が表示されている場合は、Python の最新リリースまたは今後のリリースの機能が以前のバージョンにバックポートされていることを意味します。

このチュートリアルでは、__future__ を使用して以前のバージョンの Python で Python 3 ですでに有効になっている機能について説明します。

Python の print_function には __future__ を使用する

ステートメントの代わりに関数として print キーワードを使用すると、柔軟性が大幅に向上し、print キーワードの機能を拡張するのに役立ちます。from __future__ import print_function の主な機能は、print 関数を Python 3 から Python 2 に取り込むことです。

例えば、

from __future__ import print_function

for x in range(0, 10):
    print(x, sep=" ", end="")

出力:

0123456789

ここでの print は関数として使用されていることに注意してください。これは、以前は Python 2.x でステートメントとして使用されていました。

Python の unicode_laterals には __future__ を使用する

これにより、文字列リテラルのタイプを変更できます。

Python 2 では文字列リテラルはデフォルトで ‘str’ですが、from __future__ import unicode_literals を使用すると、文字列リテラルのタイプが Unicode に変わります。

例えば、

type("h")

出力:

<type 'str'> 

しかし、from __future__ import unicode_literals を使用すると、次の出力が得られます。

from __future__ import unicode_literals

type("h")

出力:

<type 'unicode'>

from __future__ import を使用すると、すべての文字列の前に u を付けて Unicode として扱う必要がないことに注意してください。

Python の除算には __future__ を使用する

Python 2.x バージョンでは、従来の除算が使用されます。

print(8 / 7)

出力:

0

Python 2.x では、8 を 7 で単純に除算すると 0 が返されます。

from __future__ import division を使用すると、Python 2 プログラムで __truediv__() を使用できます。

例えば、

from __future__ import division

print(8 / 7)

出力:

1.1428571428571428

Python の absolute_import には __future__ を使用する

Python 2 では、暗黙的な相対インポートのみを行うことができましたが、Python 3 では、明示的なインポートまたは絶対インポートを行うことができます。__future__ import absolute_import を使用すると、括弧内に複数のインポートステートメントを角かっこで囲むことができます。

例えば、

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, LEFT, DISABLED, NORMAL, END

__future__ import absolute_import 機能がないと、1 行のコードで複数の import ステートメントを囲むことができないことに注意してください。

Python の annotations には __future__ を使用してください

アノテーションは、関数のさまざまな部分に関連付けられた Python 式です。

ここで、from __future__ import annotations を使用すると、Python モジュールで評価されるアノテーションの入力方法が変更されます。注釈の評価を延期し、すべての注釈を異なる注釈として魔法のように扱います。

例えば、

from __future__ import annotations


class C:
    @classmethod
    def make(cls) -> C:
        return cls

上記のコードは、__future__ import がコードの先頭に記述されている場合にのみ機能することに注意してください。これは、Python がコードを解釈する方法を変更するためです。つまり、アノテーションを個別の文字列として扱います。

ネストされたスコープには __future__ を使用する

__future__ import nested_scopes の追加により、静的にネストされたスコープが Python に導入されました。これにより、エラーを返さずに次のタイプのコードを実行できます。

def h():
    ...

    def m(value):
        ...
        return m(value - 1) + 1

    ...

上記のコードでは、Python 2.1 より前に NameError が発生することに注意してください。

Python ジェネレーターには __future__ を使用する

ジェネレーターは、通常の関数として定義された Python の関数です。それでも、特定の値を生成する必要があるときはいつでも、return ではなく yield キーワードを使用してそれを行います。

ここでは、from __future__ import generators を使用して、連続する関数呼び出し間の状態を保存するジェネレーター関数が導入されました。

例えば、

def gen():
    c, d = 0, 1
    while 1:
        yield d
        c, d = d, c + d

with ステートメントには __future__ を使用する

これにより、Python でキーワードとして with ステートメントを追加することにより、try...except ステートメントの使用が排除されます。以下の例に示すように、主にファイル I / O の実行中に使用されます。

with open("workfile", "h") as a:
    read_data = a.read()