2009-06-16 43 views
12

在Python 2.6(及更早版本)中,通过定义__hex____oct__特殊功能,可以在一个类中重载内置函数hex()oct()。但是,没有一个特殊的函数来重载Python 2.6的新内置函数bin()的行为。可以在Python 2.6中像bin()和hex()那样重载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

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

至于为什么,答案必须使用Python 3.0,它采用__index__骗超载hex()oct()bin(),并已完全删除了__oct____hex__特殊功能。

因此,Python 2.6 bin()看起来非常像是一个真正的Python 3.0特性,它已经被移植了,而没有考虑到它是以新的Python 3方式而不是旧的Python 2方式进行操作。我也猜想,即使它被认为是一个错误,它也不可能被修复。

1

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

0

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

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

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

11

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

幸运的是,python 2.6确实提供了你想要的,以新的str.format()方法的形式。我相信,线噪声的特定位是你在找什么:

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

这个迷你语言的语法下Docs“format specification mini-language”。为了节省您的时间,我会解释我使用的字符串:

  1. 参数为零(即19)应该被格式化,用
  2. 一个神奇的“0”,以表明我想0-填充,右对齐号,用
  3. 10位精度,在
  4. 二进制格式。

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

+0

谢谢,这是有用的知道。我虽然已经设法以我想要的形式获得输出,但我无法让bin函数返回给我。你的str.format方法比我用的方法简洁得多! – 2009-06-18 12:53:44

相关问题