2017-09-26 12 views
1

나는이 (파이썬 3 코드)과 같은 코드를 보았다 :Python ftplib : 올바르게 연결 객체를 해제 하시겠습니까?

import ftplib 
from contextlib import closing 

with closing(ftplib.FTP()) as ftp: 

이 필요한 closing 방법의 사용인가? 흥미로운 answer에서 우리는 컨텍스트 매니저의 __exit__ 메쏘드가 데이타베이스 연결 객체에서 (최소한 SQLite는 아니지만) 연결을 닫지 않지만 대신 트랜잭션을 커밋한다는 것을 읽을 수 있습니다. 따라서 closing 메서드를 사용해야합니다.

파이썬의 FTP 클래스는 어떻게 사용됩니까? 파이썬 FTPLIB의 sources 보면

, 우리는이를 찾을 수 있습니다

quit 방법은 우리가 파이썬 3의 closing 방법을 사용할 필요가 없다는 생각 때문에라고
# Context management protocol: try to quit() if active 
def __exit__(self, *args): 
    if self.sock is not None: 
     try: 
      self.quit() 
     except (OSError, EOFError): 
      pass 
     finally: 
      if self.sock is not None: 
       self.close() 

그래서 우리 바로 사용할 수 있습니다 파이썬이 누락되어

with (ftplib.FTP()) as ftp: 

방법 __exit__ 때문에, closing 파이썬이 코드가 필요합니다.

이 정보가 맞습니까?

+1

당신은 자신의 질문에 대답했습니다 :) Python2에서 말한 것처럼. '__enter__' 함수 나'__exit__' 함수가 없기 때문에 컨텍스트 핸들은 당신의 경우에'ftp' 변수를 할당하는 것 외에는 아무것도하지 않습니다. 따라서 이것은 상속이며 하위 호환성을 유지하는 것입니다. 거꾸로 닌자되는 것에 관심이 없다면 건너 뛸 수 있습니다. – Torxed

+0

@Torxed 인터넷에 잘못된 코드 예제가 흩어져 있기 때문에 (많은 한 번에 작은 스크립트에서 그런 세부 사항을 신경 쓸 필요가 없음을 알고 있습니다.) 쉽게 혼란 스럽기 때문에 확인을 원했습니다. –

+0

질문하는 것이 완전히 좋은 질문입니다. 사람들이이 문제를 우연히 발견하는 경우 좀 더 긴 대답을 썼습니다. – Torxed

답변

1

당신은 대부분 당신의 자신의 질문에 대답했습니다.
댓글에 언급 된대로 인터넷이 에 "잘못된 코드 예제가 산재되어 있습니다"이기 때문에 논점의 문제입니다.

짧은 대답을 명확히하기 위해 Python3 코드가 Python2에서 예상대로 수행되지 않는 문화 유산 문제입니다. 인터넷에서 (좋은) 예제는 Python2에서 코드를 실행하는 위험성에 대한 설명을 포함하고 있습니다. 또는 코드를 작은 수정과 호환되도록 할 것입니다.

이것은 코드가 Python2에서 실행될 때 closing()이 새로운 기능을 Python3에서 에뮬레이션하는 데 사용되는 인스턴스입니다.

Python2 (FTPLIB)이없는 중 하나 __enter__ 또는 __exit__ 기능, 따라서 문맥, 그것은 앞으로 호환 만드는 제외 (IMO 쉽게 읽을 수 "쓸모없는"처리 렌더링 또한이에, 변수에 전화를 할당 이 경우 ftp).
쓸모 없게하기 위해 작성자는 호출을 사용하여 파이썬 3에 따라 자동 종료를 얻습니다. closing()을 사용했습니다.

당신이 의 경우, Python3을 사용하고 있다면, 이것은 중복되어 코드가 느려질 수 있습니다. 하위 호환성을 기대하지 않으면 특정 코드를 건너 뛸 수 있습니다.