2017-09-11 3 views
0

私はPython 2と3の間で互換性のあるアプリケーションをビルドします。これらの2つのPythonバージョン間の互換性を提供するために、私はsix libraryを使用します。Sixのソケット実装

私のコードはsocketsを使用します。 Python 3では、withステートメントを使ってそれらを作成することは可能ですが、Python 2ではそれは__exit__属性が欠けていると主張しています。

ディスポーザブルソケットを6つ用意する機能はありますか?そうでない場合は、この場合最も明確な解決策は何ですか?

答えて

1

AFAIK(ドキュメントをスキャンして)sixはこの場合あまり役に立ちません。 Pythonの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]'の代わりに6つのPythonバージョンチェック(https://pythonhosted.org/six/#package-contents)を使用することです。 – pt12lol

+0

その他の質問:python2バージョンのみを使用するのではなく、2つのバージョンを導入する利点は何ですか? – pt12lol

+0

@ pt12lolはい、私はtry-finallyを逃しました。私はPython 2でcontext managerのバージョンに 'socket'という名前を再バインドできると思いますが、そのような標準的な名前の名前を変更するのは好きではありません。代わりに、私はそれを無条件で使用できる新しい名前にバインドすることを選択しました。 –

関連する問題