Python 中的跨版本可移植性

Cross-version portability in Python

question 提供了两种计算 int 位长度的方法:

  1. 所有版本:len(bin(x))-2
  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

签出,https://wiki.python.org/moin/BitManipulation,进一步阅读