2017-09-11 16 views
0

저는 파이썬 2와 3 사이에서 호환되는 앱을 빌드합니다. 두 파이썬 버전 사이의 호환성을 제공하기 위해 six library을 사용합니다.식스의 소켓 구현

내 코드는 sockets을 사용합니다. 파이썬 3에서는 with 문을 사용하여 생성 할 수 있지만 파이썬 2에서는 __exit__ 속성이 누락되었다고 주장합니다.

6 개의 일회용 소켓을 제공하는 기능이 있습니까? 그렇지 않다면이 경우 가장 명확한 해결책은 무엇입니까?

답변

1

six AFAIK (해당 문서를 스캔하여) six은이 경우 많은 작업을 수행하지 않습니다. 파이썬 2에서는 contextmanager 장식과 컨텍스트 관리자에 socket을 마무리하고를 제공 할 수 있습니다 : 두 경우 모두

from sys import version_info 
import socket 

if version_info[0] == 2: 
    from contextlib import contextmanager 

    @contextmanager 
    def sock(*args, **kwargs): 
     s = socket.socket(*args, **kwargs) 
     try: 
      yield s 
     finally: 
      s.close() 
else: # Python 3 
    sock = socket.socket 

당신이 따라 with 문 사용

with sock(socket.AF_INET, socket.SOCK_STREAM) as s: 
    # use s 
+0

좋은 점을. 당신이 제안한 것과 비교해 적용 할 수있는 유일한 변화는'version_info [0]'대신 파이썬 버전 검사 (https://pythonhosted.org/six/#package-contents)를 사용하는 것입니다. – pt12lol

+0

추가 질문 : python2 버전 만 사용하는 대신 두 가지 버전을 도입하면 어떤 이점이 있습니까? – pt12lol

+0

@ pt12lol 예, try-finally을 놓쳤습니다. 나는 당신이 파이썬 2에서 컨텍스트 관리자 버전으로'socket' 이름을 리바 인딩 할 수 있다고 생각합니다. 그러나 표준 이름의 이름을 바꾸는 것을 좋아하지 않습니다. 대신 무조건 사용할 수있는 새 이름으로 바인딩했습니다. –