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的兼容語法請訪問其官網

http://six.readthedocs.io/

而github上提供的是對SIX庫本身的更新與建議。如果你在使用SIX的過程中遇到了問題,不妨在github中提出issue。