Python에서 __future_는 무엇에 사용되며 언제 어떻게/사용할 것인지, 그리고 어떻게 작동하는지.
__future__
Python 모듈에 자주 나타난다.나는 무엇을 이해할 수 없다.__future__
Python's doc을 읽고 나서도 언제 어떻게/사용할 것인가에 대한 것이다.
누가 예를 들어 설명해줄 수 있니?
의 기본 용도에 관한 몇 가지 대답__future__
내가 받은 것이 맞는 것 같았다.
하지만, 나는 어떻게 해야 하는지에 대해 한 가지 더 이해할 필요가 있다.__future__
작업:
나에게 가장 혼란스러운 개념은 현재의 파이썬 릴리스에 미래의 릴리즈를 위한 기능이 어떻게 포함되어 있는지, 그리고 향후 릴리즈의 기능을 이용한 프로그램이 파이썬의 현재 버전에서 어떻게 성공적으로 컴파일될 수 있는지에 대한 것이다.
현재 릴리즈는 미래의 잠재적 기능과 함께 패키징되어 있을 것으로 추측한다.단, 이 기능은 다음을 통해서만 사용할 수 있다.__future__
왜냐하면 그것들은 현재의 표준이 아니기 때문이다.내가 맞으면 알려줘.
와 함께__future__
모듈의 포함으로, 당신은 새로운 키워드를 도입하거나 호환되지 않는 변경에 서서히 익숙해질 수 있다.
예를 들어, 컨텍스트 관리자를 사용하려면from __future__ import with_statement
2.5에 다음과 같이with
키워드는 새로운 것이었고 더 이상 변수 이름으로 사용되어서는 안 된다.사용하기 위해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__()
.)
아프로포스print
:print
3.x에서 함수가 되어 키워드로서의 특수성을 상실한다.그래서 그것은 반대 방향이다.
>>> print
>>> from __future__ import print_function
>>> print
<built-in function print>
>>>
할 때
from __future__ import whatever
당신은 실제로 그것을 사용하고 있지 않다.import
진술, 하지만 미래 진술.당신은 그 모듈을 실제로 수입하는 것이 아니기 때문에 잘못된 문서를 읽고 있다.
미래의 문장은 특별하다. Python 모듈의 구문 분석 방법을 변경하므로 파일 맨 위에 있어야 한다.그것들은 당신의 파일에 있는 단어나 기호에 새로운 혹은 다른 의미를 부여한다.문서에서:
미래 문장은 특정 모듈을 향후 Python의 특정 릴리스에서 사용할 수 있는 구문 또는 의미론을 사용하여 컴파일러에 대한 지시사항이다.미래의 진술은 언어에 양립할 수 없는 변경을 도입하는 파이썬의 미래 버전으로의 마이그레이션을 용이하게 하기 위한 것이다.그것은 기능이 표준이 되는 릴리즈 전에 모듈 단위로 새로운 기능을 사용할 수 있게 한다.
이 실제로 를으로 을(乙을 수입하고 .__future__
domodule, just do
import __future__
평소처럼 접근하면 돼
__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)
이미 몇 가지 훌륭한 해답은 있지만, 그 중 어느 것도 그 해답의 완전한 목록을 다루고 있는 것은 없다.__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
Classic division은 Python 2.x 버전에서 사용된다.일부 분할 문구는 분할의 합리적인 근사치("참 분할")를 반환하고 다른 분할 문구는 바닥("바닥 분할")을 반환한다는 것을 의미한다.은 Python 3. true division은 True division이다.x/y
, 층분할은 에 의해 지정된다.x//y
.
그from __future__ import division
지시문은 파이톤 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를 할 때 입니다일반적으로 다음과 같은 파일 I/O를 수행할 때 사용된다.
with open('workfile', 'r') as f:
read_data = f.read()
print_function
:
3 괄호 Python 3 의 을 print()
print MESSAGE
문구를 쓰다
unicode_literals
『대한』의 한다.bytes
이의를 제기하다다음과 같은 문구를 의미한다.bytes('Hello world', 'ascii')
라고 간단히 표현할 수 있다.b'Hello world'
.
generator_stop
의 사용을 대체한다.StopIteration
에서 제너레이터 기능 내부에 사용되는 예외RuntimeError
예외의
위에서 언급되지 않은 다른 용도는 다음과 같다.__future__
또한 이전 버전을 사용하면 런타임 예외가 발생하기 때문에 python 2.1+ 인터프리터를 사용해야 한다.
참조
- https://docs.python.org/2/library/future.html
- https://docs.python.org/3/library/future.html
- https://docs.python.org/2.2/whatsnew/node9.html
- https://www.python.org/dev/peps/pep-0255/
- https://www.python.org/dev/peps/pep-0238/
- https://www.python.org/dev/peps/pep-0328/
- https://www.python.org/dev/peps/pep-3112/
- https://www.python.org/dev/peps/pep-0479/
그것은 이전 버전의 파이썬을 가지고 있는 동안 새로운 버전에 나타날 기능을 사용하는 데 사용될 수 있다.
예를 들면
>>> from __future__ import print_function
사용할 수 있도록 허락할 것print
함수로서:
>>> print('# of entries', len(dictionary), file=sys.stderr)
아니면 "이것은 python v2.7이니, python v2.7에도 추가된 다른 '프린트' 기능을 파이선 3에 추가한 후에 사용하십시오.그래서 나의 '프린트'는 더 이상 문장이 아니라 기능(예: "메시지" 인쇄, "메시지" 옵션)이 될 것이다.그래야 내 코드가 파이톤 3에서 실행될 때 '프린트'는 깨지지 않을 것이다."
인
from __future__ import print_function
print_function은 python v3에서 동작하는 방식에 따라 'print'의 새로운 구현을 포함하는 모듈이다.
여기에 더 많은 설명이 있다: http://python3porting.com/noconv.html
내가 매우 유용하다는 것을 알게 된 용도 중 하나는 바로 그 용법이다.print_function
로부터__future__
모듈
Python 2.7에서는 서로 다른 인쇄 문장의 char를 공백 없이 같은 선에 인쇄하기를 원했다.
마지막에 콤마(")"를 사용하여 할 수 있지만, 여분의 공간을 추가하기도 한다.다음과 같이 사용할 경우 위의 문장이 표시됨:
from __future__ import print_function
...
print (v_num,end="")
...
이것은 다음 값을 인쇄할 것이다.v_num
각 반복에서 공백 없이 한 줄로 반복한다.
__future__
파이톤 모듈이다.수입명세서를 분석하고 그들이 수입하는 모듈을 찾을 것으로 예상되는 기존 도구들을 혼동하지 않기 위해 추가되었다.버전 2.1에 추가되어 버전 2.1 이전에 사용할 경우 가져오기가 실패함.
이제 다음 코드를 참조하십시오.
>>> from __future__ import division
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072)
사단은 의 형식으로 돌아왔다._Feature(OptionalRelease, MandatoryRelease, CompilerFlag)
. OptionalRelease와 필수 릴리스는 모두 다음과 같은 형식의 5-tules이다.
(
PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
PY_MINOR_VERSION, # the 1; an int
PY_MICRO_VERSION, # the 0; an int
PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
PY_RELEASE_SERIAL # the 3; an int
)
따라서 우리의 경우, OptionalRelease는 2.2.0a2이고, 필수 Release는 3.0.0a0이다.
OptionalRelease는 기능이 수락된 첫 번째 릴리즈를 알려준다.
의무 릴리즈는 해당 기능이 언어의 일부가 될 것인지 또는 해당 기능이 언어의 일부가 된 시기를 예측한다. 그 이후 릴리스에서 모듈은 해당 기능을 사용하기 위해 더 이상 미래 문구를 필요로 하지 않지만 이러한 가져오기를 계속 사용할 수 있다.필수 릴리즈가 없음이면 계획된 기능이 삭제된다.
컴파일러플래그는 (비트필드) 플래그로서, 동적으로 컴파일된 코드에서 형상을 활성화하기 위해 내장 함수 컴파일()에 네 번째 인수를 통해 전달되어야 한다.이 플래그는 _Feature 인스턴스의 컴파일러_flag 속성에 저장된다.
Python 3.0 이후 인쇄는 더 이상 단순한 문장이 아니라 기능이다.그리고 PEP 3105에 포함되어 있다.
또한 나는 파이썬 3.0 패키지가 여전히 이러한 특별한 기능을 가지고 있다고 생각한다.Python의 전통적인 "Pyramid 프로그램"을 통해 그 사용성을 확인해보자.
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:
*
**
***
****
일반적인 인쇄 기능을 사용하면 인쇄()에 추가 뉴라인이 함께 제공되기 때문에 동일한 출력을 얻을 수 없을 것이다.그래서 안쪽의 루프가 실행될 때마다 다음 줄에 *를 인쇄할 것이다.
'IT이야기' 카테고리의 다른 글
window.location을 사용하도록 강제 적용.href(vue-properties 해시 모드) (0) | 2022.03.17 |
---|---|
vue.js: 계산된 속성에서 라우터 매개 변수에 액세스할 수 없음 (0) | 2022.03.17 |
Vue가 특정 API 요청에 대한 데이터를 렌더링하지 않음 (0) | 2022.03.17 |
서로 다른 버전의 반응에서 반응 native 및 react-remedx 충돌 (0) | 2022.03.17 |
각도 7 관측 가능.날짜별로 구독을 신청하시겠습니까? (0) | 2022.03.17 |