16

在 Python 2.6(及更早版本)中,可以通过定义特殊函数在类中重载内置函数hex()oct()内置函数。然而,没有一个特殊的函数可以重载 Python 2.6 的新内置函数的行为。__hex____oct____bin__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'

我怀疑没有办法实现这一点,但我认为问它不会有什么坏处!

4

4 回答 4

12

正如您已经发现的那样,您不能 override bin(),但听起来您不需要这样做。您只需要一个 0 填充的二进制值。不幸的是,在 python 2.5 及之前的版本中,你不能使用“%b”来表示二进制,所以你不能使用“%”字符串格式化操作符来达到你想要的结果。

幸运的是,python 2.6 确实以新的str.format()方法的形式提供了你想要的东西。我相信您正在寻找这种特殊的线路噪音:

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

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

  1. 参数零(即19)应该被格式化,使用
  2. 一个神奇的 " 0" 表示我想要 0 填充的右对齐数字,使用
  3. 10 位精度,单位为
  4. 二进制格式。

您可以使用这种语法来实现对齐和填充的各种创意版本。

于 2009-06-18T10:04:34.817 回答
7

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

至于为什么,答案必须在 Python 3.0 中,它用于__index__重载hex(),oct()bin(), 并且完全去掉了__oct____hex__特殊函数。

So the Python 2.6 bin() looks very much like it's really a Python 3.0 feature that has been back-ported without much consideration that it's doing things the new Python 3 way rather than the old Python 2 way. I'd also guess that it's unlikely to get fixed, even if it is considered to be a bug.

于 2009-07-06T16:01:13.373 回答
1

bin 函数从对象的__index__函数中接收它的值。所以对于一个对象,你可以定义转换为二进制的值,但是你不能定义字符串的格式。

于 2009-06-16T15:23:38.127 回答
0

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

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

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

于 2009-06-16T16:49:54.647 回答