可以像Python 2.6中的oct()和hex()一样重载bin()吗?

Sco*_*ths 14 python binary overloading python-2.6

在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'
Run Code Online (Sandbox Code Playgroud)

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

Gly*_*yph 12

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

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

>>> '{0:010b}'.format(19)
'0000010011'
Run Code Online (Sandbox Code Playgroud)

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

  1. 参数零(即19)应格式化,使用
  2. 一个魔术" 0"表示我想要0-padded,右对齐数字,用
  3. 10位精度,in
  4. 二进制格式.

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


Sco*_*ths 7

我认为简短的回答是"不,bin()不能像oct()和那样超负荷" hex().

至于为什么,答案必须在于Python 3.0,它用于__index__重载hex(),oct()并且完全bin()删除了__oct____hex__特殊功能.

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