SIX是用於python2與python3兼容的庫。
它存在的目的是為了擁有無需修改即可在Python 2和Python 3上同時工作的代碼。話雖這麼說,但是這並不代表在Python 3中引用該庫就可以輕鬆地跑Python 2的代碼。
實際上,SIX是重定義了在python2和3中有差異的函數,例如dict的獲取全部鍵值函數:在Python2中是
.iterkeys()
在Python3中是
.keys()
而在SIX中是
six.iterkeys(dict)(當然對應版本的原函數也能夠使用)
也就是說,離開了SIX庫的話你寫的代碼不論在Python2還是Python3中都無法運行。因此不是急於追求兼容性的話並不需要使用這個庫。
安裝:
https://github.com/benjaminp/six/releases
解壓後雙擊steup.py即可。
使用
import six
之後按照SIX提供的語法書寫即可寫出pyhton2/3上兼容的代碼。
six.PY2/ six.PY3 :檢查編譯器版本是否為python2/3
以下是SIX提供的兼容語法:
常量定義:
six.class_types
可能的類類型。在Python 2中,這包含舊類和新類。在Python 3中,這只是新類。
six.integer_types
可能的整數類型。在Python 2中,這是long或 int,在Python 3中同int。
six.string_types
文本數據的可能類型。這是Python 2終點basestring()和 Python 3中的str。
six.text_type
用於表示(Unicode)文本數據的類型。這是unicode()在Python 2和Python 3中的str(Pyhon3對文本數據進行了整合,默認為Unicode文本數據)。
six.binary_type
代表二進位數據的類型。這是Python 2中的str和 Python 3中的bytes。
six.MAXSIZE
像list 或dict這樣的容器的最大尺寸。這相當於 Python 2.6及更高版本(包括3.x)的sys.maxsize。請注意,這與sys.maxint Python 2 非常相似,但並不相同 。sys.maxint在Python 3中沒有直接的等價物, 因為它的整數類型的長度僅受限於內存大小。
內置函數定義
1、six.get_unbound_function(meth)
獲取非綁定方法的meth。在Python 3,不存在非綁定方法,所以這個功能只是返回meth不變。用法示例:
from six import get_unbound_function
class X(object):
def method(self):
pass
method_function = get_unbound_function(X.method)six.get_method_function(meth)
2、six.get_method_self(meth)
獲取self綁定的方法的meth。
3、six.get_function_closure(func)
等效於Python 2.6+中的func.__closure__和Python 2.5中的func.func_closure
4、six.get_function_code(func)
獲取與func關聯的代碼對象。等效於Python 2.6+中的 func.__code__和Python 2.5中的func.func_code。
5、six.get_function_defaults(func)
獲取與func關聯的默認元組。等效於Python 2.6+中的 func.__defaults__和Python 2.5中的func.func_defaults。
6、six.get_function_globals(func)
獲取全局函數。等效於Python 2.6+中的func.__globals__和Python 2.5中的func.func_globals。
7、six.next(it) six.advance_iterator(it)
獲取迭代器it的下一個項目。如果迭代器到達末尾,則會引發StopIteration。等效於Python 中的it.next()2和Python 3中的next(it).Python 2.6及更高版本具有內置next函數,因此只有需要兼容Python 2.5版本及以下時才需要該函數。
8、six.callable(obj )
檢查是否可以調用obj。callable標記已經在Python 3.2中有返回,所以只有在支持Python 3.0或3.1時才需要使用six的版本。
9、six.iterkeys(字典,** kwargs )
返回字典鍵上的迭代器。等效於Python 2中的 dictionary.iterkeys()和Python 3中的dictionary.keys()。 kwargs被傳遞給底層方法。
10、six.itervalues(字典,** kwargs )
返回字典值的迭代器。等效於Python 2中的dictionary.itervalues()和Python 3中的dictionary.values()。kwargs被傳遞給底層方法。
11、six.iteritems(字典,** kwargs )
返回字典項目的迭代器。等效於Python 2中的 dictionary.iteritems()和Python 3中的dictionary.items()。 kwargs被傳遞給底層方法。
12、six.iterlists(字典,** kwargs )
調用Python 2中的dictionary.iterlists() 或Python 3中的dictionary.lists()。原版的Python映射類型沒有這種等效; 此方法旨在能夠使用像Werkzeug's這樣的多值詞典。 kwargs被傳遞給底層方法。
13、six.viewkeys(字典)
通過字典的鍵返回視圖。等效於 Python 2.7中的dict.viewkeys()和Python 3中的dict.keys()。
14、six.viewvalues(字典)
通過字典的值返回視圖。等效於 Python 2.7中的dict.viewvalues()和Python 3中的dict.values()。
15、six.viewitems(字典)
返回字典項目的視圖。等效於 Python 2.7中的dict.viewitems()和Python 3中的dict.items()。
16、six.create_bound_method(func,obj )
返回一個方法對象包裝func並綁定到obj。在Python 2和Python 3上,這將返回一個types.MethodType對象。這個包裝器函數存在的原因是,在Python 2中,MethodType構造函數需要傳遞obj的類。
17、six.create_unbound_method(func,cls )
返回一個未綁定的方法對象包裝函數。在Python 2中,這將返回一個types.MethodType對象。在Python 3中,未綁定的方法不存在,並且此包裝將簡單地返回func。
18、class six.Iterator
一個用於製作小型迭代器的類。其目的是將其劃分子類並提供一種__next__方法。在Python 2中,Iterator 有一個方法:next。它只代表__next__。或許可以僅僅為 __next__取別名next。但是這會對重定義了 __next__的子類造成嚴重影響。Iterator在Python 3中是空的。(實際上,它只是被命名為object。)
關於SIX的函數就介紹到這裡。想要了解更多SIX的兼容語法請訪問其官網
而github上提供的是對SIX庫本身的更新與建議。如果你在使用SIX的過程中遇到了問題,不妨在github中提出issue。