可以像Python 2.6中的oct()和hex()一样重载bin()吗?
-
05-07-2019 - |
题
在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'
此迷你语言的语法位于“格式下规范迷你语“在文档中。为了节省你一些时间,我将解释我正在使用的字符串:
-
应使用格式化
- 参数零(即
19
) - 一个神奇的“
0
”用 表示我想要0填充,右对齐的数字
- 10位精度,
- 二进制格式。 醇>
您可以使用此语法来实现对齐和填充的各种创意版本。
bin函数从对象的 __ index __
函数接收它的值。因此,对于对象,您可以定义转换为二进制的值,但不能定义字符串的格式。
您可以通过使用您自己的实现覆盖/替换内置bin()函数来实现与hex和oct相同的行为,该实现尝试在传递的对象上调用 bin 并且回退到如果对象未提供 bin ,则使用标准bin()函数。但是,在显式优于隐式的基础上,将应用程序编码为依赖于bin()的自定义版本可能不是一个好主意,所以可能只是给函数一个不同的名称,例如。
def mybin(n):
try:
return n.__bin__()
except AttributeError:
return bin(n)
至于为什么界面不一致,我不确定。也许是因为bin()最近被添加,所以这是一个轻微的疏忽?