Python 中的跨版本可移植性
Cross-version portability in Python
此 question 提供了两种计算 int
位长度的方法:
- 所有版本:
len(bin(x))-2
- 2.7+:
x.bit_length()
我需要我的代码与 2.6+ 一起工作,所以我不能使用第二种解决方案。
this我能做到最好吗?
import sys
if sys.hexversion < 0x02070000
def bitlen(x): return len(bin(x))-2
else:
def bitlen(x): return x.bit_length()
备选方案是
try:
(1).bit_length()
def bitlen(x): return x.bit_length()
except AttributeError:
def bitlen(x): return len(bin(x))-2
我可能会写成:
def bitlen(x):
"""The bit length of the integer x."""
try:
return x.bit_length()
except AttributeError: # I guess!
return len(bit(x)) - 2
这消除了对显式版本检查的需要。如果你想考虑函数的签出,也许:
if hasattr(1, 'bit_length'):
bitlen = lambda x: x.bit_length()
else:
bitlen = lambda x: len(bit(x)) - 2
这适用于 2.6 及以下以及更高版本。
def bitlen(int_type):
length = 0
while (int_type):
int_type >>= 1
length += 1
return(length)
# and then
bitlen(0b10000) # --> 5
此 question 提供了两种计算 int
位长度的方法:
- 所有版本:
len(bin(x))-2
- 2.7+:
x.bit_length()
我需要我的代码与 2.6+ 一起工作,所以我不能使用第二种解决方案。
this我能做到最好吗?
import sys
if sys.hexversion < 0x02070000
def bitlen(x): return len(bin(x))-2
else:
def bitlen(x): return x.bit_length()
备选方案是
try:
(1).bit_length()
def bitlen(x): return x.bit_length()
except AttributeError:
def bitlen(x): return len(bin(x))-2
我可能会写成:
def bitlen(x):
"""The bit length of the integer x."""
try:
return x.bit_length()
except AttributeError: # I guess!
return len(bit(x)) - 2
这消除了对显式版本检查的需要。如果你想考虑函数的签出,也许:
if hasattr(1, 'bit_length'):
bitlen = lambda x: x.bit_length()
else:
bitlen = lambda x: len(bit(x)) - 2
这适用于 2.6 及以下以及更高版本。
def bitlen(int_type):
length = 0
while (int_type):
int_type >>= 1
length += 1
return(length)
# and then
bitlen(0b10000) # --> 5