我目前的项目需要广泛使用位字段。我找到了一个简单的,功能齐全的recipe for bit a field class,但它缺少我需要的一些功能,所以我决定扩展它。我刚刚实施__str__
和__repr__
,我想确保遵循惯例。
__str__
应该是非正式和简洁的,所以我让它返回位字段的十进制值(即str(bit field 11)
将是"3"
。
__repr__
应该是对象的官方表示,所以我让它返回实际的位字符串(即repr(bit field 11)
将是"11"
)。
您认为此实施是否符合str
和repr
的约定?
此外,我使用bin()
函数来获取存储在类中的值的位串。这与Python不兼容< 2.6,有替代方法吗?
干杯,
皮特
答案 0 :(得分:12)
__repr__
最好是一个可用于重新创建对象的字符串,例如,如果您对其使用eval
,请参阅文档here。这不是一门精确的科学,因为它可能取决于模块用户如何导入它,例如。
我会让__str__
返回二进制字符串,__repr__
返回Classname(binary_string)
,或者可以用来重新创建对象的任何内容。
在bitstring模块(我维护)中__str__
是十六进制的,如果bitstring是4位长的倍数,否则它是二进制或两者的组合。此外,如果bitstring非常长,那么它会被截断(你不想尝试在交互式会话中打印100 MB的bittring!)
如果我是你,我会完全避免使用bin()
功能。原因是如果你的位串以零位开头就不能使用它(参见我的问题here)。我建议使用bin
方法或属性。
答案 1 :(得分:1)
我会考虑让__str__
返回十六进制表示。通过这种方式,可以更容易地观察实际比特值是什么,因此更有用。但仍然非常简洁(事实上,字符数少于十进制表示)。
答案 2 :(得分:0)
__repr__
需要返回一些内容,如果传递给您的构造函数,则会创建一个与原始对象完全相同的新对象。
你的返回'11'但是如果你将'11'传递给你的构造函数,你将得不到相同的位域。所以这个__repr__
不行。