Pythonの__future__の用途と使用方法/使用方法、および機能


693

__future__Pythonモジュールに頻繁に現れます。Pythonのドキュメントを__future__読んでも、何のために、いつどのように使用するのかわかりません。__future__

誰かが例で説明できますか?

__future__私が受け取った基本的な使用法に関するいくつかの答えは正しいようです。

ただし、__future__動作についてもう1つ理解する必要があります。

私にとって最も混乱する概念は、現在のpythonリリースに将来のリリースの機能がどのように含まれているか、そして将来のリリースの機能を使用するプログラムを現在のバージョンのPythonで正常にコンパイルする方法です。

現在のリリースには、将来の機能がパッケージされていると思います。ただし、これらの機能は__future__現在の標準ではないため、使用しないと使用できません。私が正しいかどうか教えてください。


10
これは、将来の声明の最初の提案です。そもそもなぜそれが存在するのか、いつ、どのように使用するのかが自然に理解できるようになるので役立ちました。 python.org/dev/peps/pep-0236
Jpaji Rajnish


3
futureステートメントは、特定のモジュールがPythonの指定された将来のリリースで利用可能になる構文またはセマンティクスを使用してコンパイルされる必要があるというコンパイラーへのディレクティブです。futureステートメントは、言語に互換性のない変更を導入するPythonの将来のバージョンへの移行を容易にすることを目的としています。これにより、機能が標準になるリリースの前に、モジュールごとに新しい機能を使用できます。
shivam13juna

回答:


384

__future__モジュールのインクルージョン、あなたはゆっくりと互換性のない変更または新しいキーワードを導入し、このようなものに慣れすることができます。

たとえば、コンテキストマネージャーを使用する場合from __future__ import with_statementwithキーワードは新しく、変数名として使用する必要がなくなったため、2.5で行う必要がありました。使用するためにwithはPython 2.5以前ではPythonのキーワードとして、あなたは上からインポートを使用する必要があります。

別の例は

from __future__ import division
print 8/7  # prints 1.1428571428571428
print 8//7 # prints 1

何もなければ__future__、両方のprintステートメントが表示されます1

内部的な違いは、そのインポートなしで/__div__()メソッドにマップされ、それとともに__truediv__()使用されるということです。(いずれの場合もを//呼び出します__floordiv__()。)

Apropos printprint3.xで関数になり、キーワードとしての特別なプロパティを失います。ですから、逆になります。

>>> print

>>> from __future__ import print_function
>>> print
<built-in function print>
>>>

151
忘れないでくださいfrom __future__ import braces:p
mdeous

13
@zoogleflattタブ好きの方なら、PEP 8
はわかり

5
@glglglまあ技術的には彼らが好まれていると言うだけです。これが正確になぜであるかを読んだ後、それは私には完全に明確ではありませんでした、私はコードをよりきれいにするためにインデントレベルを正確に一致させる必要があると思いますか?
Jpaji Rajnish 2015

4
@zoogleflatt確かに、ほとんどの人が1レベルのインデントに4つのスペースを使用するという事実とも関係があります。互換性の理由から、1つのタブは8つのスペースに相当し、タブとスペースの混在は推奨されません(特に、AFAIK、 Py3)
glglgl 2015年

1
@whiteSkar現在のところ、新しいバージョンのpython 3については最新ではありませんが、まだ使用されていると思いますが、これらのかなり古い機能ではおそらく必要ないでしょう。Python 3ではprintは間違いなく関数ですが、を使用する他の機能があるかもしれません__future__。(編集:まだ使用されているdocs.python.org/3/library/__future__.htmlを参照してください。)
glglgl

195

あなたがするとき

from __future__ import whatever

あなたは実際に使用していません importステートメントではなく、将来のステートメントを使用しています。実際にはそのモジュールをインポートしていないため、間違ったドキュメントを読んでいます。

将来のステートメントは特別です-それらはあなたのPythonモジュールが解析される方法を変更します、それが彼らが理由です はファイルの先頭になければなりません。それらは、ファイル内の単語または記号に新しい(または異なる)意味を与えます。ドキュメントから:

futureステートメントは、特定のモジュールがPythonの指定された将来のリリースで利用可能になる構文またはセマンティクスを使用してコンパイルされる必要があるというコンパイラーへのディレクティブです。futureステートメントは、言語に互換性のない変更を導入するPythonの将来のバージョンへの移行を容易にすることを目的としています。これにより、機能が標準になるリリースの前に、モジュールごとに新しい機能を使用できます。

実際に__future__モジュールをインポートしたい場合は、

import __future__

通常どおりにアクセスします。


4
技術的には、関連する名前がローカル変数にバインドされているため、これもインポートステートメントです。from __future__ import print_functionどちらもprintキーワードの動作を変更し、実行時の影響はprint_function = __import__("__future__").print_function
pppery

112

__future__ プログラマーが現在のインタープリターと互換性のない新しい言語機能を有効にするために使用できる疑似モジュールです。たとえば、11/4現在、式はに評価され2ます。それが実行されるモジュールが実行によって真の除算を有効にしていた場合:

from __future__ import division

11/4はに評価され2.75ます。__future__モジュールをインポートしてその変数を評価することにより、新しい機能が最初に言語に追加された時期と、それがデフォルトになる時期を確認できます。

  >>> import __future__
  >>> __future__.division
  _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)

1
したがって、変数のリリースバージョンに基づいて、インタープリターが指示よりも新しいバージョンを使用している場合、これimport __future__ xyzはノーオペレーションですか?
レイ

4
ブラウザの世界のポリフィルにいくらか似ています
cs01

47

古いリリースのPythonを使用しているときに、新しいバージョンで表示される機能を使用するために使用できます。

例えば

>>> from __future__ import print_function

print関数として使用できます:

>>> print('# of entries', len(dictionary), file=sys.stderr)

29

すでにいくつかの素晴らしい答えがありますが、それらのどれもが __future__現在声明がサポートしている。

簡単に言えば、文は、言語の新しい機能を使用するためにはPythonインタプリタを強制します。__future__


現在サポートされている機能は次のとおりです。

nested_scopes

Python 2.1以前では、次のコードはNameErrorを発生させていました

def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...

from __future__ import nested_scopesディレクティブを有効にするには、この機能を可能にします。

generators

連続する関数呼び出し間の状態を保存するために、以下のようなジェネレーター関数が導入されました。

def fib():
    a, b = 0, 1
    while 1:
       yield b
       a, b = b, a+b

division

Python 2.xバージョンではクラシック除算が使用されます。分割ステートメントには、分割の妥当な近似(「真の分割」)を返すものと、フロア(「床分割」)を返すものがあります。Python 3.0以降では、真の分割はによって指定されますがx/y、床の分割はx//yます。

このfrom __future__ import divisionディレクティブは、Python 3.0スタイルの除算の使用を強制します。

absolute_import

括弧で複数のimportステートメントを囲むことができます。例えば:

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

の代わりに:

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

または:

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

with_statement

ステートメントwithをPythonのキーワードとして追加して、ステートメントを不要にしtry/finallyます。これの一般的な用途は、次のようなファイルI / Oを行う場合です。

with open('workfile', 'r') as f:
     read_data = f.read()

print_function

スタイルステートメントのprint()代わりに、Python 3の括弧スタイルの関数呼び出しを強制的に使用しますprint MESSAGE

unicode_literals

bytesオブジェクトのリテラル構文を紹介します。などのステートメントbytes('Hello world', 'ascii')は、として簡単に表現できることを意味しb'Hello world'ます。

generator_stop

StopIterationジェネレータ関数内で使用される例外の使用を例外に置き換えますRuntimeError

上記で言及されていないもう1つの用途は__future__、古いバージョンを使用するとランタイム例外がスローされるため、このステートメントではPython 2.1+インタープリターの使用も必要になることです。


参考文献


あなたがオフラインであるとすると、Pythonは将来のバージョンが利用可能かどうかをどのようにして知るのでしょうか?また、将来のバージョンのpythonをコンピュータにインストールしていない場合、将来の機能はどのように使用されますか?
Mohsen Haddadi、

25

それとも、「これはpython v2.7なので、python 3で追加された後、python v2.7にも追加された別の 'print'関数を使用するので、私の 'print'はステートメントではなくなります。 (たとえば、 "message"を印刷する)が関数(たとえば、print( "message"、options)です)。これにより、私のコードがpython 3で実行されたときに、 'print'は壊れません。

from __future__ import print_function

print_functionは、python v3での動作に応じた「print」の新しい実装を含むモジュールです。

これにはより多くの説明があります:http : //python3porting.com/noconv.html


2

私が非常に便利であるとわかった用途の1つは、print_functionfrom __future__モジュールです。

Python 2.7では、異なる印刷ステートメントの文字をスペースなしで同じ行に印刷したかったのです。

末尾にコンマ( "、")を使用することもできますが、余分なスペースも追加されます。上記のステートメントを次のように使用した場合:

from __future__ import print_function
...
print (v_num,end="")
...

これによりv_num、各反復の値がスペースなしで1行に出力されます。


-3

Python 3.0以降、printは単なるステートメントではなく、関数になっています。PEP 3105に含まれています。

また、Python 3.0パッケージにはまだこれらの特別な機能があると思います。Pythonの伝統的な「ピラミッドプログラム」を通してその使いやすさを見てみましょう:

from __future__ import print_function

class Star(object):
    def __init__(self,count):
        self.count = count

    def start(self):
        for i in range(1,self.count):
            for j in range (i): 
                print('*', end='') # PEP 3105: print As a Function 
            print()

a = Star(5)
a.start()

Output:
*
**
***
****

通常の印刷機能を使用すると、print()に余分な改行が追加されるため、同じ出力を実現できません。したがって、内側のforループが実行されるたびに、次の行に*が出力されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.