可彬()在Python 2.6重载像OCT()和十六进制()?(Can bin() be overl

2019-07-28 20:15发布

在Python 2.6(或更早)的hex()oct()内置函数可以以类通过定义重载__hex____oct__特殊功能。 但是没有一个__bin__超载Python 2.6中的新的行为特殊功能bin()的内置功能。

我想知道是否有灵活地超载任何方式bin()如果不是我想知道为什么不一致的接口?

我不知道__index__特殊功能可以使用,但是这并不灵活,因为它只能返回一个整数。 我的具体使用情况是从比特串模块,其中前导零位被认为是显著:

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

我怀疑,有没有实现这一目标的方式,但我认为它不会伤害问!

Answer 1:

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

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

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

这个迷你语言的语法是在“ 格式化规范的迷你语言的文档”。 为了节省您的时间,我会解释我使用的字符串:

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

你可以使用这个语法来实现各种调整和填充的创意版本。



Answer 2:

我想简单的答案是:“不, bin()不能超载像oct()hex() 。”

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

所以python的2.6 bin()看上去很像是真的一个Python 3.0的功能,已经回油口不认为它做的事情新的Python 3的方式,而不是旧的Python 2路太多的考虑。 我还猜想,它不可能得到固定,即使它被认为是一个错误。



Answer 3:

该回收站功能接收它是从对象的值__index__功能。 因此,对于一个对象,你可以定义转换为二进制值,但是你不能定义字符串的格式。



Answer 4:

你可以达到同样的行为为十六进制和十月通过重写/用你自己的实现更换内置斌()函数试图调用传递的对象上bin和回落到标准箱()函数,如果对象没“T提供 。 然而,其依据是明确优于隐式,编码您的应用程序依赖于斌(定制版)上可能不是一个好主意,所以也许只是给功能不同的名称,如

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

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



文章来源: Can bin() be overloaded like oct() and hex() in Python 2.6?