python之six用法,pythonsix,six.PY2 返回
python之six用法,pythonsix,six.PY2 返回
six.PY2 返回一个表示当前运行环境是否为python2的boolean值
six.PY3 返回一个表示当前运行环境是否为python3的boolean值
import six,sysprint(six.PY2) #python2结果为Trueprint(six.PY3) #python3结果为Truesys.version_info[0] #PY2 = 2sys.version_info[0] #PY3 = 3sys.version_info[0:2] #PY34>= (3, 4)
常量
six.class_types这里主要是针对python中的old-style和new-style, new-style为type, old-style为 types.ClassType。
python2中同时有old-style和new-style,python3中只有new-style。
six.integer_types这里针对python2和python3中各自支持的int类型进行了区分:在python2中,存在 int 和 long 两种整数类型;在python3中,仅存在一种类型int。
six.string_types这里针对python2和python3中各自的string类型进行了区分:在python2中,使用的为basestring;在python3中,使用的为str。
six.text_type这里针对python2和python3中的文本字符进行了区分:在python2中,使用的文本字符的类型为unicode;在python3中使用的文本字符的类型为str。
具体可以参考Python2 与 Python3 的编码对比
six.MAXSIZElist、string、dict以及其他的容器所能支持的最大尺寸。
if PY3: string_types = str, integer_types = int, class_types = type, text_type = str binary_type = bytes MAXSIZE = sys.maxsizeelse: string_types = basestring, integer_types = (int, long) class_types = (type, types.ClassType) text_type = unicode binary_type = str if sys.platform.startswith("java"): # Jython always uses 32 bits. MAXSIZE = int((1 << 31) - 1) else: # It‘s possible to have sizeof(long) != sizeof(Py_ssize_t). class X(object): def __len__(self): return 1 << 31 try: len(X()) except OverflowError: # 32-bit MAXSIZE = int((1 << 31) - 1) else: # 64-bit MAXSIZE = int((1 << 63) - 1) del X
对象模型兼容
six.get_unbound_function(meth)针对python2和python3中unbound function的支持不同,在python2中存在unbound function,在python3中不存在unbound function。
if PY3: def get_unbound_function(unbound): return unboundelse: def get_unbound_function(unbound): return unbound.im_func
有关的测试代码如下:
>>> class Foo():... def bar():... print(1)... def too(self):... print(2)...>>>
在python2的环境中:
>>> Foo.bar<unbound method Foo.bar>>>> Foo().bar<bound method Foo.bar of <__main__.Foo instance at 0x10e8a7998>>>>> Foo.too<unbound method Foo.too>>>> Foo().too<bound method Foo.too of <__main__.Foo instance at 0x10e8a7998>>
在python3的环境中:
>>> Foo.bar<function Foo.bar at 0x10ebe4bf8>>>> Foo().bar<bound method Foo.bar of <__main__.Foo object at 0x10ebeaa58>>>>> Foo.too<function Foo.too at 0x10ebe4c80>>>> Foo().bar<bound method Foo.bar of <__main__.Foo object at 0x10ebeaa58>>
使用six.get_unbound_function(meth):
在python2环境中:
>>> import six>>> six.get_unbound_function(Foo.too)<function too at 0x10e89faa0>>>> six.get_unbound_function(Foo.bar)<function bar at 0x10e89fa28>
在python3环境中:
>>> import six>>> six.get_unbound_function(Foo.too)<function Foo.too at 0x10a158c80>>>> six.get_unbound_function(Foo.bar)<function Foo.bar at 0x10a158bf8>six.get_method_function(meth)
此方法可以在方法对象之外得到函数。在python2中使用im_func, 在python3中使用__func__。
if PY3: _meth_func = "__func__"else: _meth_func = "im_func"get_method_function = operator.attrgetter(_meth_func)
有关的测试代码如下:
>>> class Foo():... def bar():... print(1)... def too(self):... print(2)...>>>
在python2环境中:
>>> import six>>> six.get_method_function(Foo().bar)<function bar at 0x10c8c6a28>>>> six.get_method_function(Foo.bar)<function bar at 0x10c8c6a28>>>> six.get_method_function(Foo().too)<function too at 0x10c8c6aa0>>>> six.get_method_function(Foo.too)<function too at 0x10c8c6aa0>
在python3环境中:
>>> import six>>> six.get_method_function(Foo.bar)Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘function‘ object has no attribute ‘__func__‘>>> six.get_method_function(Foo().bar)<function Foo.bar at 0x1047dbbf8>>>> six.get_method_function(Foo.too)Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘function‘ object has no attribute ‘__func__‘>>> six.get_method_function(Foo().too)<function Foo.too at 0x1047dbc80>six.get_method_self(meth)
针对python2以及python3中的不同,返回bound method的self。其中:python2中使用im_self,python3中使用__self__。
if PY3: _meth_self = "__self__"else: _meth_self = "im_self"get_method_self = operator.attrgetter(_meth_self)
有关的测试代码如下:
>>> class Foo():... def bar():... print(1)... def too(self):... print(2)...>>>
在python2的环境中:
>>> import six>>> six.get_method_self(Foo.bar)>>> a = six.get_method_self(Foo.bar)>>> a>>> six.get_method_self(Foo().bar)<__main__.Foo instance at 0x10563da70>>>> a = six.get_method_self(Foo().bar)>>> a<__main__.Foo instance at 0x10563dd88>>>> six.get_method_self(Foo.too)>>> a = six.get_method_self(Foo.too)>>> a>>> six.get_method_self(Foo().too)<__main__.Foo instance at 0x10563da28>>>> a = six.get_method_self(Foo().too)>>> a<__main__.Foo instance at 0x10563da70>
在python3的环境中:
>>> import six>>> six.get_method_self(Foo.bar)Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘function‘ object has no attribute ‘__self__‘>>> six.get_method_self(Foo().bar)<__main__.Foo object at 0x1059bbb00>>>> six.get_method_self(Foo.too)Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘function‘ object has no attribute ‘__self__‘>>> six.get_method_self(Foo().too)<__main__.Foo object at 0x1059bbb38>six.get_function_closure(func)
针对python2和python3中的不同,返回函数当中的闭包。其中,python2使用func_closure,python3使用 __closure__。
if PY3: _func_closure = "__closure__"else: _func_closure = "func_closure" get_function_closure = operator.attrgetter(_func_closure)
关于闭包的理解可以参考:
浅显理解 Python 闭包闭包的概念、形式与应用有关的测试代码如下:
>>> def foo(n):... a = 1... def bar(n):... return a-n... return bar
此处需要注意的是foo函数返回的是bar函数,而不是具体的值。
在python2的环境当中:
>>> foo.__closure__>>> foo(1)<function bar at 0x10c25aa28>>>> foo(1).__closure__(<cell at 0x10c25eb40: int object at 0x7f9460d0bca8>,)>>> foo(1).func_closure(<cell at 0x10c25ed70: int object at 0x7f9460d0bca8>,)
在python3的环境当中:
>>> foo.__closure__>>> foo(1)<function foo.<locals>.bar at 0x10c46dbf8>>>> foo(1).__closure__(<cell at 0x10c451198: int object at 0x10be73170>,)>>> foo(1).func_closureTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘function‘ object has no attribute ‘func_closure‘six.get_function_code(func)
针对python2和python3中获取func中的code对象,将使用不同的方式进行获取。在python2中,将使用func_code;在python3中,将使用code。
if PY3: _func_code = "__code__"else: _func_code = "func_code"get_function_code = operator.attrgetter(_func_code)
如果你对其中的code object是什么比较感兴趣,可以参考下面的资料:
Exploring Python Code Objects有关的测试代码如下:
>>> def boo():... return 1
在python2的环境当中:
>>> boo.func_code<code object boo at 0x1101092b0, file "<stdin>", line 1>>>> boo().func_codeTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘int‘ object has no attribute ‘func_code‘
在python3的环境当中:
>>> boo.__code__<code object boo at 0x104d8a930, file "<stdin>", line 1>>>> boo().__code__Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘int‘ object has no attribute ‘__code__‘six.get_function_defaults(func)
针对python2和python3中的区别,获取func中的默认元组。在python2中,使用func_defaults;在python3中,使用__defaults__。
if PY3: _func_defaults = "__defaults__"else: _func_defaults = "func_defaults"get_function_defaults = operator.attrgetter(_func_defaults)
有关的测试代码如下:
>>> def boo(a=1):... return a...
在python2环境中:
>>> boo.func_defaults(1,)>>> boo.__defaults__(1,)>>> boo().func_defaultsTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘int‘ object has no attribute ‘func_defaults‘>>> boo().__defaults__Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘int‘ object has no attribute ‘__defaults__‘
在python3环境中:
>>> boo.__defaults__(1,)>>> boo.func_defaultsTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘function‘ object has no attribute ‘func_defaults‘>>> boo().__defaults__Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘int‘ object has no attribute ‘__defaults__‘>>> boo().func_defaultsTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘int‘ object has no attribute ‘func_defaults‘six.get_function_globals(func)
获取函数当中的全局变量。在python2中,使用func_globals;在python3中,使用__globals__。
if PY3: _func_globals = "__globals__"else: _func_globals = "func_globals"get_function_globals = operator.attrgetter(_func_globals)
有关的测试代码:
>>> def boo(a=1):... x = 100... b = x - a... return b
在python2环境中:
>>> boo.__globals__{‘__builtins__‘: <module ‘__builtin__‘ (built-in)>, ‘__name__‘: ‘__main__‘, ‘boo‘: <function boo at 0x109a6e9b0>, ‘__doc__‘: None, ‘__package__‘: None}>>> boo.func_globals{‘__builtins__‘: <module ‘__builtin__‘ (built-in)>, ‘__name__‘: ‘__main__‘, ‘boo‘: <function boo at 0x109a6e9b0>, ‘__doc__‘: None, ‘__package__‘: None}
在python3环境中:
>>> boo.__globals__{‘__name__‘: ‘__main__‘, ‘__doc__‘: None, ‘__package__‘: None, ‘__loader__‘: <class ‘_frozen_importlib.BuiltinImporter‘>, ‘__spec__‘: None, ‘__annotations__‘: {}, ‘__builtins__‘: <module ‘builtins‘ (built-in)>, ‘boo‘: <function boo at 0x1029d8e18>}>>> boo.func_globalsTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ‘function‘ object has no attribute ‘func_globals‘six.next(it) or six.advance_iterator(it)
获取到迭代器的下一个。在python2环境中,使用it.next();在python3环境中,使用next(it)
try: advance_iterator = nextexcept NameError: def advance_iterator(it): return it.next()next = advance_iterator
关于迭代器的内容可以参考一下文件:
迭代器在python2环境中:
>>> it = iter([1,2,3,4,5])>>> while True:... try:... x = it.next()... except NameError:... print "name error"... except StopIteration:... print "end"... break...end>>> it = iter([1,2,3,4,5])>>> while True:... try:... x = next(it)... except NameError:... print "name error"... except StopIteration:... print "end"... break...end
在python3环境中:
>>> it = iter([1,2,3,4,5])>>> while True:... try:... x = it.next()... except NameError:... print("name error")... except StopIteration:... print("end")... break...Traceback (most recent call last): File "<stdin>", line 3, in <module>AttributeError: ‘list_iterator‘ object has no attribute ‘next‘>>> it = iter([1,2,3,4,5])>>> while True:... try:... x = next(it)... except NameError:... print("name error")... except StopIteration:... print("end")... break...endsix.callable(obj)
该方法用来检验obj是否可以进行调用。
关于python的callable属性,请参考一下文件:
try: callable = callableexcept NameError: def callable(obj): return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
有关的测试代码:
>>> def add(x, y):... return x + y...
在python2环境中:
>>> callable(add)True
在python 3.1环境中:
>>> callable(add)Traceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name ‘callable‘ is not defined
在python3.2之后的环境中:
>>> callable(add)True
python之six用法
评论关闭