2012-09-19 2 views
7

파이썬 2.x에서는 두 정수를 나눠 정수를 반환합니다. 당신이 정수 나눗셈을 할 // 대신 /를 사용할 필요는 import기호를 가져온 후 __future__에서 심볼을 제거/가져올 수 있습니까?

>>> 3/2 
1 
>>> from __future__ import division 
>>> 3/2 
1.5 
>>> 
>>> 
>>> 3//2 
1 
>>> 4/3 
1.3333333333333333 
>>> 

: 그러나, 당신은 당신이 float 값을 얻을 수 있습니다

from ___future___ import division 

를 사용합니다. import을 되돌려서 /이 정수 나누기를 다시 수행하도록하려면 어떻게해야합니까?

from __future__ import division 
print(1/2) 

그런 다음 다른 파일에서로드 :

+2

왜 그렇게하고 싶습니까? –

답변

12

__future__ 수입이 특별하며 취소 할 수 없습니다. 그들의 행동을 읽을 수 있습니다 here. 여기

몇 가지 관련 부분은 다음과 같습니다

미래의 문을 인식하고 컴파일시에 특별하게 취급된다 : 코어 구조의 의미에 대한 변경 사항은 종종 다른 코드를 생성하여 구현됩니다. 새로운 기능이 새로운 예약어와 같은 새로운 호환되지 않는 구문을 도입하는 경우 일 수 있습니다.이 경우 컴파일러는 모듈을 다르게 구문 분석해야 할 수 있습니다. 이러한 결정은 런타임까지 연기 할 수 없습니다.
...
인터프리터 인터프리터 프롬프트에서 입력 한 이후의 명령문은 나머지 인터프리터 세션에 적용됩니다.

__future__ 문은 런타임과 달리 컴파일 타임에 처리되므로 변경된 동작을 되돌리기위한 런타임 방법이 없습니다.

일반 모듈을 사용하면 네임 스페이스에서 가져온 항목을 삭제하고 sys.modules에서 해당 가져 오기 항목을 삭제하여 모듈을 제거하거나 가져올 수 있습니다 (이 두 번째 부분은 사용 사례에 따라 필요하지 않을 수도 있습니다. 모듈을 다시 가져온 경우 강제로 다시로드하십시오.)

+0

+1 (이 문제를 설명하는)과 Brendan Long 's (OP가 실제로하고 싶은 일을 어떻게 수행 할 수 있는지 설명). – abarnert

+1

또한 확장 모듈 (_i.e._ C와 같은 컴파일 언어로 작성된 모듈)은 가져올 때 해석기의 주소 공간에 통합되므로 언로드 할 수 없습니다. – holdenweb

4

import 문은 example.py이 파일이있는 경우, 예를 들어, 그래서 당신이 가져올 파일에 로컬

import example # prints 0.5 because `division` is imported in example.py 
print(1/2) # prints 0 because `division` is not imported in this file 

그래서 일부 코드에서만 사용되는 가져 오기를 원한다면 해당 코드를 별도의 파일에 저장하십시오.

당신이 준 경우, 나는 그것이 도움이되는지 잘 모르겠다. 정수 나누기가 필요할 때 //을 사용하지 않는 이유는 무엇입니까?

+0

왜 누군가가 미래 부문을 "제거"하고 싶은지에 대한 하나의 대답은 단위 테스트입니다. 나누기 연산자가 오버로드되어 Python 2에서 단일 슬래시 동작을 확인하려고합니다. 직접'__div __() '를 호출 할 수 있습니다. 귀하의 대답은 더 나은 해결책 일 수 있습니다 : 다른 소스 파일에서 단일 슬래시로 테스트하십시오. –

관련 문제