파이썬에서 __future__ 란 무엇이며 어떻게 / 어떻게 / 어떻게 작동하며 어떻게 작동하는지


694

__future__파이썬 모듈에서 자주 나타납니다. 파이썬의 doc을__future__ 읽은 후에도 무엇이 무엇을 어떻게 사용 해야하는지 이해하지 못합니다 .__future__

누구든지 예를 들어 설명 할 수 있습니까?

__future__내가받은 기본 사용법에 관한 몇 가지 대답이 맞았습니다 .

그러나 __future__작동 방식 과 관련하여 한 가지 더 이해해야 합니다.

가장 혼란스러운 개념은 현재 python 릴리스에 향후 릴리스 기능이 포함되는 방법과 향후 릴리스의 기능을 사용하는 프로그램을 현재 버전의 Python에서 성공적으로 컴파일하는 방법입니다.

현재 릴리스에는 향후 잠재적 인 기능이 포함되어 있다고 생각합니다. 그러나 기능은 __future__현재 표준이 아니기 때문에 사용해야 만 사용할 수 있습니다 . 내가 옳은지 알려주세요.


10
이것은 미래의 진술에 대한 최초의 제안입니다. 나는 그것이 왜 처음에 존재하는지 이해하는 데 도움이되며 그것을 언제 어떻게 사용하는지 자연스럽게 따라갑니다. python.org/dev/peps/pep-0236
Jpaji Rajnish


3
장래의 진술은 특정 모듈이 미래의 특정 파이썬 릴리스에서 사용할 수있는 구문 또는 의미를 사용하여 컴파일되어야한다는 컴파일러의 지시입니다. 미래의 진술은 호환되지 않는 언어 변경을 도입 한 이후 버전의 Python으로 쉽게 마이그레이션 할 수 있도록하기위한 것입니다. 기능이 표준으로 제공되기 전에 모듈별로 새로운 기능을 사용할 수 있습니다.
shivam13juna

답변:


384

함께 __future__모듈의 포함, 천천히 호환되지 않는 변경 또는 새로운 키워드를 도입 그러한 사람들에 익숙 할 수 있습니다.

예를 들어, 컨텍스트 관리자를 사용 from __future__ import with_statement하려면 with키워드가 새롭고 더 이상 변수 이름으로 사용되어서는 안되므로 2.5에서 수행해야 했습니다 . 사용하기 위해서는 with파이썬 2.5 이상에서 파이썬 키워드로, 당신은 위에서 가져 오기를 사용해야합니다.

또 다른 예는

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

내용이 없으면 __future__print문장이 모두 인쇄 1됩니다.

내부 차이점은 가져 오기가 없으면 메소드에 /맵핑 __div__()되지만 메소드와 함께 맵핑 __truediv__()됩니다. (어쨌든으로 //전화하십시오 __floordiv__().)

Apropos print: print3.x에서 함수가되어 키워드로서의 특수 속성을 잃습니다. 그래서 그것은 다른 길입니다.

>>> print

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

151
잊지 마세요 from __future__ import braces: p
mdeous

13
@zoogleflatt 탭 사용자가 더 많다면 PEP 8을 모릅니다. 탭을 사용 하지 않는 것이 좋습니다 .
glglgl

5
@glglgl 기술적으로 그들은 그들이 선호한다고 말합니다. 왜 이것이 정확한지 읽은 후에 완전히 명확하지 않았습니다. 코드를 깔끔하게 만들기 위해 들여 쓰기 수준이 정확히 일치해야한다고 생각합니다.
Jpaji Rajnish

4
@zoogleflatt 그것은 또한 대부분의 사람들이 1 단계 들여 쓰기를 위해 4 개의 공백을 사용한다는 사실과 관련이 있습니다. 호환성의 이유로 하나의 탭이 8 개의 공백과 동일하고 혼합 탭과 공백이 권장되지 않습니다 (AFAIK, 심지어는 허용되지 않음) Py3)
glglgl

1
@whiteSkar 나는 현재 최신 버전의 python 3을 사용하고 있지 않지만, 여전히 사용중인 것으로 가정합니다.이 오래된 기능으로는 필요하지 않을 것입니다. 파이썬 3에서는 print확실히 함수이지만을 사용할 수있는 다른 기능이있을 수 있습니다 __future__. (편집 : 여전히 사용되는 docs.python.org/3/library/__future__.html 참조 )
glglgl

195

당신이 할 때

from __future__ import whatever

당신은 실제로를 사용하지 않습니다 import 진술을 미래의 진술을 사용하고 있습니다. 실제로 해당 모듈을 가져 오지 않기 때문에 잘못된 문서를 읽고 있습니다.

미래의 진술은 특별합니다. 파이썬 모듈의 구문 분석 방식이 바뀌기 때문에 해야한다 파일의 맨 위에합니다. 파일의 단어 나 기호에 새로운 의미를 부여합니다. 문서에서 :

장래의 진술은 특정 모듈이 미래의 특정 파이썬 릴리스에서 사용할 수있는 구문 또는 의미를 사용하여 컴파일되어야한다는 컴파일러의 지시입니다. 미래의 진술은 호환되지 않는 언어 변경을 도입 한 이후 버전의 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경우 no-op입니까?
Ray

4
브라우저 세계에서 polyfill과 다소 유사합니다
cs01

47

이전 버전의 Python을 사용하면서 최신 버전에 표시되는 기능을 사용하는 데 사용할 수 있습니다.

예를 들어

>>> from __future__ import print_function

print함수 로 사용할 수 있습니다 .

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

29

이미 훌륭한 답변이 있지만 그중 어느 것도 전체 목록을 다루지 않습니다. __future__ 현재 성명서에서 지원 .

간단히 말해, __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을 키워드로 키워드에 추가하여 명령문 이 필요하지 않습니다 try/finally. 이것의 일반적인 용도는 다음과 같은 파일 I / O를 수행 할 때입니다.

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

print_function:

style 문 print()대신 Python 3 괄호 스타일 함수 호출을 사용하도록 print MESSAGE합니다.

unicode_literals

bytes객체 의 리터럴 구문을 소개 합니다. 과 같은 진술 bytes('Hello world', 'ascii')은 간단히로 표현 될 수 있음을 의미한다 b'Hello world'.

generator_stop

StopIteration생성기 함수 내 에서 사용 된 예외 사용을 예외로 바꿉니다 RuntimeError.

위에서 언급하지 않은 또 다른 용도 __future__는 이전 버전을 사용하면 런타임 예외가 발생하므로 명령문에 Python 2.1 이상 인터프리터도 사용해야한다는 것입니다.


참고 문헌


오프라인 상태라고 가정하면 파이썬은 향후 버전을 사용할 수 있는지 여부를 어떻게 알 수 있습니까? 컴퓨터에 미래 버전의 파이썬을 설치하지 않은 경우 미래 ​​기능을 어떻게 사용합니까?
Mohsen Haddadi

25

또는 "파이썬 v2.7이므로 파이썬 3에 추가 된 후에도 파이썬 v2.7에 추가 된 다른 '인쇄'기능을 사용하십시오. 따라서 내 '인쇄'는 더 이상 진술이되지 않습니다. (예 : print "message") 그러나 기능 (예 : print ( "message", options). 파이썬 3에서 코드를 실행할 때 'print'가 중단되지 않습니다. "

from __future__ import print_function

print_function은 python v3에서 동작하는 방식에 따라 새로운 'print'구현을 포함하는 모듈입니다.

자세한 설명은 다음과 같습니다. http://python3porting.com/noconv.html


2

나는 매우 유용한 것으로 판명 용도 중 하나는이다 print_function에서__future__ 모듈입니다.

Python 2.7에서는 다른 인쇄 문의 문자를 공백없이 동일한 줄에 인쇄하기를 원했습니다.

끝에 쉼표 ( ",")를 사용하여 수행 할 수 있지만 추가 공간도 추가합니다. 위의 진술은 다음과 같이 사용될 때

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

v_num공백없이 한 줄로 각 반복 의 값을 인쇄합니다 .


-4

파이썬 3.0 이후, print는 더 이상 단순한 문장이 아니라 함수입니다. PEP 3105에 포함되어 있습니다.

또한 Python 3.0 패키지에는 여전히 이러한 특수 기능이 있다고 생각합니다. 파이썬에서 전통적인 "피라미드 프로그램"을 통해 그 유용성을 보자 :

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.