2017-12-14 3 views
1

Python 3의 범위 내에서 변수를 저장/복원하는 쉬운 방법이 있습니까?Python 3에서 변수를 저장/복원하는 일반적인 방법

x=4 
with x=5: 
    ... do something with x that's temporarily 5 

또는 파이썬 인터프리터가 할당이 (왼쪽을 구현하는 것이 저장됩니다 아주 쉽게 될 것 같다

with os.environ["FOO"] = "BAR": 
    ... do something here 

, 오른쪽은 다음과 같습니다 예를 들어

__enter__에서 실행, __exit__에 복원 됨)

또는 적어도 일부 라이브러리 또는 기타.

임시 변수를 사용하려면 try/finally 블록이 필요하며 본질적으로 안전하지 않으며 런타임 오류가 발생하기 쉽습니다. 비교에 의해 "unpythonic"인 것처럼 보입니다.

try: 
    save = os.environ["FOO"] 
    os.environ["FOO"] = "BAR" 

    ... do something here 

finally: 
    os.environ["FOO"] = save 
+2

왜 이런 식으로합니까? 그것은 unpythonic 것 및 코드 가독성을 줄입니다. 왜 임시 변수를 사용하지 않는가? – ubadub

+4

왜 기능이 ...? 어쨌든 보통 유지 보수가 가능한 코드를 만듭니다. – deceze

+1

위의 두 가지 문제에 모두 답변하고 제안 된 구문이 훨씬 더 "파이썬 적이"라는 이유를 설명했습니다. 읽기 쉽고 버그가 발생하지 않았습니다. 또한 "기능"은 많은 경우 사용할 수 없습니다. (ENV 수정은 표준적인 예제이지만 다른 많은 것들이 있습니다!) –

답변

0

이 작업을 수행하는 라이브러리를 만들었습니다. 비록 그것을 할 수있는 쉬운 방법이 있는지 확실하지 않습니다. 내 라이브러리가 "patch.object"및 "patch.dict"의 복제본 일 수 있습니다. 그 문서들은 나에게 막연한 것처럼 보입니다. 예를 들어

https://gist.github.com/earonesty/ac0617a5672ae1a41be1eaf316dd63e4

:

import os 
from varlib import vartemp, envtemp 

x = 3 
y = 4 
print ("Before: x is", x, "y is", y) 

with vartemp({'x':93,'y':94}): 
    print ("In temp: x is", x, "y is", y) 

print ("After: x is", x, "y is", y) 

with envtemp({'foo':'bar'}): 
    print(os.getenv('foo')) 

print(os.getenv('foo')) 

출력은 여기에 있습니다 :

Before: x is 3 y is 4 
In temp: x is 93 y is 94 
After: x is 3 y is 4 
bar 
None 
+5

도서관 홍보를 위해 질문을 했습니까? – kazemakase

+2

당신의 라이브러리에 대해/r/Python을 말할 수 있다고 생각합니다. 그래서 승진을위한 것이 아닙니다. – ForceBru

+2

@kazemakase 질문하고 스스로 대답하는 데는 아무런 문제가 없습니다. 우리는 공개하지 않고 자기 홍보에 눈살을 찌푸리고 "이 문제를 해결하는 도서관을 만들었습니다."라고 말하면서 그것을 사용하는 데 필요한 코드를 포함하면 100 % 괜찮습니다. –

관련 문제