Python 패키지 의 두 가지 주의사항(추천)

3455 단어 python폐쇄 하 다
폐쇄 란 무엇 입 니까?
쉽게 말 하면 패 킷 을 닫 는 것 은 서로 다른 설정 정보 에 따라 서로 다른 결 과 를 얻 는 것 이다.
다시 한 번 전문 적 인 해석 을 살 펴 보 자.폐쇄(Closure)는 품사 폐쇄(Lexical Closure)의 약칭 으로 자유 변 수 를 인용 한 함수 이다.이 인 용 된 자유 변 수 는 이 함수 와 함께 존재 할 것 이 며,이미 그것 을 만 드 는 환경 에서 벗 어 났 더 라 도 예외 가 아니다.그래서 폐쇄 는 함수 와 관련 된 인용 환경 으로 구 성 된 실체 라 는 또 다른 주장 이 있다.
지연 바 인 딩
Python 패키지 함수 가 인용 한 외부 자유 변 수 는 연결 지연 입 니 다.
Python

In [2]: def multipliers():
  ...:   return [lambda x: i * x for i in range(4)] 
In [3]: print [m(2) for m in multipliers()]
[6, 6, 6, 6]
In [2]: def multipliers():
  ...:   return [lambda x: i * x for i in range(4)] 
In [3]: print [m(2) for m in multipliers()]
[6, 6, 6, 6]
상기 코드:i 는 패키지 함수 가 인용 한 외부 작용 역 의 자유 변수 로 내부 함수 가 호출 될 때 만 변수 i 의 값 을 검색 할 수 있 습 니 다.순환 이 끝 났 기 때문에 i 는 최종 값 3 을 가리 키 기 때문에 각 함수 호출 은 같은 결 과 를 얻 었 습 니 다.
해결 방법:
1)패 킷 함 수 를 생 성 할 때 즉시 바 인 딩(함수 형 인삼 의 기본 값 사용):
Python

In [5]: def multipliers():
  return [lambda x, i=i: i* x for i in range(4)]
    ...: 
In [6]: print [m(2) for m in multipliers()]
[0, 2, 4, 6]
In [5]: def multipliers():
  return [lambda x, i=i: i* x for i in range(4)]
    ...: 
In [6]: print [m(2) for m in multipliers()]
[0, 2, 4, 6]
상기 코드:패 킷 함 수 를 생 성 할 때 모든 패 킷 함수 에 기본 값 을 가 진 매개 변 수 를 볼 수 있 습 니 다.i=i,이때 해석 기 는 i 의 값 을 찾 고 이 를 형 삼 i 에 부여 합 니 다.이렇게 하면 패 킷 함 수 를 생 성 하 는 외부 역할 영역(즉 외부 순환 에서)에서 변수 i 를 찾 아 현재 값 을 형 삼 i 에 부여 합 니 다.
2)funtools.partial 사용:
Python

In [26]: def multipliers():
  return [functools.partial(lambda i, x: x * i, i) for i in range(4)]
  ....: 
In [27]: print [m(2) for m in multipliers()]
  [0, 2, 4, 6]
In [26]: def multipliers():
  return [functools.partial(lambda i, x: x * i, i) for i in range(4)]
  ....: 
In [27]: print [m(2) for m in multipliers()]
  [0, 2, 4, 6]
상기 코드:연결 지연 으로 인해 문제 가 생 길 수 있 을 때 funtools.partial 구조 편향 함 수 를 통 해 자유 변 수 를 폐쇄 함수 에 우선 연결 할 수 있 습 니 다.
패키지 함수 에서 인 용 된 자유 변 수 를 다시 연결 하 는 것 을 금지 합 니 다.
Python

def foo(func):
  free_value = 8
  def _wrapper(*args, **kwargs):
    old_free_value = free_value #    free_value
    free_value = old_free_value * 2 #      free_value
    func(*args, **kwargs)
    free_value = old_free_value
  return _wrapper
def foo(func):
  free_value = 8
  def _wrapper(*args, **kwargs):
    old_free_value = free_value #    free_value
    free_value = old_free_value * 2 #      free_value
    func(*args, **kwargs)
    free_value = old_free_value
  return _wrapper
이상 코드 가 잘못 보 고 됩 니 다.Unbound LocalError:local variable'freevalue'referenced before assignment,상기 코드 는 초기 화 상태(freevalue)그러나 내부 패 킷 함 수 를 실행 할 때 필요 에 따라 새로운 상 태 를 변화 시 킬 수 있 습 니 다(freevalue = old_free_value*2)의 장식 기,내부 에 재 귀속 이 발생 하여 해석 기 는 freevalue 는 국부 변수 로 간주,oldfree_value = free_value 는 잘못 보고 합 니 다.해석 기 는 freevalue 는 할당 없 이 인용 되 었 습 니 다.
해결:
패키지 함수 가 인용 한 자유 변 수 를 수정 하려 고 할 때 list 에 넣 으 면 freevalue = [8], free_value 는 수정 할 수 없 지만 freevalue[0]는 안전하게 수 정 될 수 있 습 니 다.
또한 Python 3.x 는 nonlocal 키 워드 를 추가 하여 이 문 제 를 해결 할 수 있 습 니 다.
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 Python 클 로 징 의 두 가지 주의사항 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기