Python 부분 변수 필드 에서 코드 실행

문제.
사용 범위 내 에서 코드 세 션 을 실행 하고 싶 으 며 실행 후 모든 결과 가 보이 지 않 기 를 바 랍 니 다.
해결 방안
이 문 제 를 이해 하기 위해 서 먼저 간단 한 장면 을 시험 해 보 세 요.우선,전역 네 임 스페이스 에서 코드 세 션 을 실행 합 니 다.

>>> a = 13
>>> exec('b = a + 1')
>>> print(b)
14
>>>
그리고 한 함수 에서 같은 코드 를 실행 합 니 다.

>>> def test():
...   a = 13
...   exec('b = a + 1')
...   print(b)
...
>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in test
NameError: global name 'b' is not defined
>>>
마지막 에 네 임 에 러 이상 을 던 진 것 은 재exec() 문구 가 실 행 된 적 이 없 는 것 과 같다.뒤의 계산 에서exec() 실행 결 과 를 사용 하고 싶다 면 문제 가 생 길 것 이다.
이러한 오 류 를 수정 하기 위해 서 는 호출 exec() 전에 locals() 함 수 를 사용 하여 부분 변수 사전 을 얻어 야 합 니 다.그 후에 부분 사전 에서 수 정 된 변수 값 을 가 져 올 수 있 습 니 다.예 를 들 면:

>>> def test():
...   a = 13
...   loc = locals()
...   exec('b = a + 1')
...   b = loc['b']
...   print(b)
...
>>> test()
14
>>>
토론 하 다.
실제로 exec() 의 정확 한 사용 은 비교적 어렵다.대부분의 경우 사용exec() 을 고려 해 야 할 때 더 좋 은 해결 방안(예 를 들 어 장식 기,폐쇄,원류 등)도 있다.
그러나 만약 당신 이 여전히 exec()를 사용 하려 고 한다 면,이 절 은 그것 을 정확하게 사용 하 는 방법 을 보 여 줍 니 다.기본 적 인 상황 에서 exec()는 호출 자 부분 과 전체 범위 에서 코드 를 실행 합 니 다.그러나 함수 에서 exec()에 전달 되 는 부분 범 위 는 실제 부분 변 수 를 복사 하여 구 성 된 사전 입 니 다.따라서 exec()가 수정 작업 을 수행 하면 이러한 수정 후의 결 과 는 실제 부분 변수 값 에 영향 을 주지 않 습 니 다.다음은 다른 예 입 니 다.

>>> def test1():
...   x = 0
...   exec('x += 1')
...   print(x)
...
>>> test1()
0
>>>
위의 코드 에서 부분 변 수 를 호출 locals() 할 때 exec() 에 전 달 된 부분 변 수 를 복사 합 니 다.코드 가 실 행 된 후에 이 사전 의 값 을 심사 하면 수 정 된 값 을 얻 을 수 있 습 니 다.다음은 프 리 젠 테 이 션 예 입 니 다.

>>> def test2():
...   x = 0
...   loc = locals()
...   print('before:', loc)
...   exec('x += 1')
...   print('after:', loc)
...   print('x =', x)
...
>>> test2()
before: {'x': 0}
after: {'loc': {...}, 'x': 1}
x = 0
>>>
마지막 출력 을 자세히 살 펴 보 세 요.loc 에서 수 정 된 값 을 x 에 수 동 으로 할당 하지 않 으 면 x 변수 값 은 변 하지 않 습 니 다. locals() 을 사용 할 때 는 조작 순서 에 주의해 야 한다.호출 될 때마다locals() 부분 변수 값 의 값 을 가 져 오고 사전 에 해당 하 는 변 수 를 덮어 씁 니 다.아래 이 실험의 출력 결 과 를 주의 깊 게 관찰 하 십시오.

>>> def test3():
...   x = 0
...   loc = locals()
...   print(loc)
...   exec('x += 1')
...   print(loc)
...   locals()
...   print(loc)
...
>>> test3()
{'x': 0}
{'loc': {...}, 'x': 1}
{'loc': {...}, 'x': 0}
>>>

>>> def test3():
...   x = 0
...   loc = locals()
...   print(loc)
...   exec('x += 1')
...   print(loc)
...   locals()
...   print(loc)
...
>>> test3()
{'x': 0}
{'loc': {...}, 'x': 1}
{'loc': {...}, 'x': 0}
>>>
마지막 호출locals() 시 x 의 값 이 어떻게 덮어 지 는 지 주의 하 십시오. locals() 의 대안 으로 사전 을 사용 하여exec() 에 전달 할 수 있 습 니 다.예 를 들 면:

>>> def test4():
...   a = 13
...   loc = { 'a' : a }
...   glb = { }
...   exec('b = a + 1', glb, loc)
...   b = loc['b']
...   print(b)
...
>>> test4()
14
>>>
대부분의 경우 이런 방식 은 사용exec() 의 가장 좋 은 실천 이다.전역 과 부분 사전 이 뒤의 코드 에 접근 할 때 초기 화 되 었 음 을 보증 해 야 합 니 다.
또 하 나 는 사용exec() 하기 전에 더 좋 은 대안 이 있 는 지 물 어 봐 야 할 수도 있다.대부분의 경우 exec() 를 사용 하 는 것 을 고려 해 야 할 때 더 좋 은 해결 방안 도 있다.예 를 들 어 장식 기,폐쇄,메타 류 또는 다른 메타 프로 그래 밍 특성 등 이다.
이상 은 Python 이 부분 변수 필드 에서 코드 를 실행 하 는 상세 한 내용 입 니 다.Python 부분 변수 필드 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기