在Python 2.6(及更早版本)中, hex() oct()内置函数可以通过定义 __ hex __ __ oct __ 特殊功能。但是,没有 __ bin __ 特殊函数来重载Python 2.6的新 bin()内置函数的行为。

我想知道是否有任何方法可以灵活地重载 bin(),如果不是,我想知道为什么不一致的界面?

我知道可以使用 __ index __ 特殊函数,但这不灵活,因为它只能返回一个整数。我的特定用例来自 bitstring 模块,其中前导零位被认为是重要的:

>>> a = BitString(length=12)       # Twelve zero bits
>>> hex(a)
'0x000'
>>> oct(a)
'0o0000'
>>> bin(a)
'0b0' <------ I want it to output '0b000000000000'

我怀疑没有办法实现这一目标,但我认为这样做不会有害!

有帮助吗?

解决方案 2

我认为简短的回答是“不, bin()不能像 oct() hex()那样重载。 “

至于为什么,答案必须在于Python 3.0,它使用 __ index __ 来重载 hex() oct()和< code> bin(),并且已经完全删除了 __ oct __ __ hex __ 特殊功能。

所以Python 2.6 bin()看起来非常像它真的是一个Python 3.0功能,它已经被反向移植而没有太多考虑它正在以新的Python 3方式而不是旧Python进行操作2种方法。我也猜测它不太可能得到修复,即使它被认为是一个bug。

其他提示

正如您已经发现的那样,您无法覆盖 bin(),但听起来并不像您需要这样做。你只想要一个0填充的二进制值。不幸的是,在python 2.5和之前的版本中,你不能使用“%b”。表示二进制,因此您不能使用“%”字符串格式化运算符,以实现您想要的结果。

幸运的是,python 2.6以新的 str的形式提供了你想要的东西.format()方法。我相信你正在寻找的这一点线噪声:

>>> '{0:010b}'.format(19)
'0000010011'

此迷你语言的语法位于“格式下规范迷你语“在文档中。为了节省你一些时间,我将解释我正在使用的字符串:

    应使用格式化
  1. 参数零(即 19
  2. 一个神奇的“ 0 ”用
  3. 表示我想要0填充,右对齐的数字
  4. 10位精度,
  5. 二进制格式。
  6. 您可以使用此语法来实现对齐和填充的各种创意版本。

bin函数从对象的 __ index __ 函数接收它的值。因此,对于对象,您可以定义转换为二进制的值,但不能定义字符串的格式。

您可以通过使用您自己的实现覆盖/替换内置bin()函数来实现与hex和oct相同的行为,该实现尝试在传递的对象上调用 bin 并且回退到如果对象未提供 bin ,则使用标准bin()函数。但是,在显式优于隐式的基础上,将应用程序编码为依赖于bin()的自定义版本可能不是一个好主意,所以可能只是给函数一个不同的名称,例如。

def mybin(n):
    try:
        return n.__bin__()
    except AttributeError:
        return bin(n)

至于为什么界面不一致,我不确定。也许是因为bin()最近被添加,所以这是一个轻微的疏忽?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top