Python2と3の互換性ライブラリ「Six」




takkun
どうも!たっくんです!
アベンジャーズ/インフィニティ・ウォー早く観たい!!(*´д`*)

自力で「Python2」のコードを「Python3」にも対応させようとすると、なかなかアレコードを書くことになりますよね、、、

そこで便利そうなのが「six」です!

sixのインストール

pipが使える状態であれば、簡単にインストールすることができます!インストールされるファイルは、単独のpythonファイルなのでMayaなどにコピーするだけで使えそうです!(`・ω・´)ゞ

pip install six

バージョン判定

バージョン判定して処理を分岐したい時、素直にやると「sys.version_info」から判定することになりますが、Sixには定義済みの変数があります(*´ω`*)b

以下のコードは、Python2.7で実行した場合の結果です。

import six
print six.PY2
print six.PY3
# True
# False

メタクラス

Python3でメタクラスの追加方法が変更されましたが、Sixのデコレータ「@add_metaclass」を使うと、両バージョン対応で記述することができます!

from abc import ABCMeta, abstractmethod
import six

@six.add_metaclass(ABCMeta)
class AbstractItem(object):
    __metaclass__ = ABCMeta
    @abstractmethod
    def create(self):
        pass
         
    @abstractmethod
    def delete(self):
        pass

Python のバージョン間で異なりうる定数

isinstance、issubclassで、色々判定をしたい時も、Python2とPython3ではベースになるものが変わっていますが、定義済みの変数が用意されています。

以下のコードは、Python2.7で実行した場合の結果です。

import six

print six.class_types
# (<type 'type'>, <type 'classobj'>)

print six.integer_types
# (<type 'int'>, <type 'long'>)

print six.string_types
# (<type 'basestring'>,)

print six.text_type
# <type 'unicode'>

print six.binary_type
# <type 'str'>

print six.MAXSIZE
# 9223372036854775807

その他にも

その他にも、「exec_」「print」などもたっくさん機能が用意されているので、是非ドキュメントに目を通して見てください!(*´ω`*)b