- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望为我的复合对象(即由其他(可能是复合的)对象组成的对象)提供信息表示。但是,因为我的代码从根本上处理高精度数字(请不要问我为什么不只使用 double ),所以我最终会得到如下所示的表示形式:http://pastebin.com/jpLgAfxC 。坚持使用默认值 __repr__
会更好吗? ?
最佳答案
是否有详细的repr
取决于您想要完成的任务。对于复杂或复合对象,我知道我更喜欢以下哪一个:
Point(x=1.12, y=2.2, z=-1.9)
<__main__.Point object at 0x103011890>
它们都告诉我对象是什么类型,但只有第一个清楚所涉及的所有(相关)值,并避免仅在极少数情况下相关的低级信息。
我喜欢看到真正的值(value)观。但是,鉴于您的值(value)观是如此巨大,您的情况是一个特例:
72401317106217603290426741268390656010621951704689382948334809645
87850348552960901165648762842931879347325584704068956434195098288
38279057775096090002410493665682226331178331461681861612403032369
73237863637784679012984303024949059416189689048527978878840119376
5152408961823197987224502419157858495179687559851
它们不能用于大多数开发或调试目的。我确信有时您需要完整的序列化 - 例如,发送到文件或从文件发送。但这些一定相当罕见,不是吗?我无法想象你真的记住了所有 309 个数字,或者可以通过目视判断上面的数字与下面的数字是否相同:
72401317106217603290426741268390656010621951704689382948334809645
87850348552960901165648762842931879347325584704068956434195098288
38279057775096090002410493665682226331178331461681861612403032369
73327863637784679012984303024949059416189689048527978878840119376
5152408961823197987224502419157858495179687559851
它们不一样。但除非你是斯波克或终结者,否则你不会一眼就知道这一点。 (实际上,我在这里让它变得更容易,长度包裹以避免水平滚动。)
所以我建议(大量)缩短它们的表示,以使输出更容易处理。这就像每次想要打印 Chapter
对象时打印出整个章节文本。矫枉过正。
相反,尝试一些更短、更容易使用的东西。截断和/或省略号是有用的。例如
72401...59851
7240131710...
您也可以使用对象 ID。如果您的高精度类型是 HP
,则:
HP(0x103011890)
至少这样你就能够区分它们了。然而,使用对象 id 的一个缺点是,对象在逻辑上可能是等效的,但如果您创建具有相同逻辑值的多个对象,它们将具有不同的 id,因此当它们不同时,它们会显得不同。您可以通过创建自己的短哈希函数来解决这个问题。散列有一点艺术性,但对于代表来说,即使是简单的东西也可以。例如:
import binascii, struct
def shorthash(s):
"""
Given a Python value, produce a short alphanumeric hash that
helps identify it for debugging purposes. A riff on
http://stackoverflow.com/a/2511059/240490
Enhanced to remove trailing boilerplate, and to work
on either Python 2 or Python 3.
"""
hashbytes = binascii.b2a_base64(struct.pack('l', hash(s)))
return hashbytes.decode('utf-8').rstrip().rstrip("=")
然后在高精度类别中定义您的代表:
def __repr__(self):
clsname = self.__class__.__name__
return '{0}({1}).format(clsname, shorthash(self.value))
其中 self.value
是创建数百位值的任何本地属性、属性或方法。如果您要子类化 int
,则这可能只是 self
。
这可以让你:
HP(Tea+5MY0WwA)
上面两个巨大的、几乎相同的数字?使用此方案,它们呈现为:
HP(XhkG0358Fx4)
HP(27CdIG5elhQ)
这显然是不同的。您可以将其与一些值表示结合起来。例如。一些替代方案:
HP(~7.24013e308 @ XhkG0358Fx4)
HP(dig='72401...59851', ndigits=309, hash='XhkG0358Fx4')
您会发现这些较短的值在调试上下文中更有用。当然,您可以保留方法或属性(例如 .value
、.digits
或 .alldigits
),以应对以下情况:您需要每一点,但将常见情况定义为更容易消耗的东西。
关于python - __repr__ 用于(大型)复合对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29375477/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
如何创建特殊方法 __repr__我可以打印的地方,例如 '6 of spades'或 'Q of diamonds' ? 我如何从 namedtuple 访问数据,请记住我有一个 list的 nam
是否可以使下面代码中的__repr__返回数据帧? 下面的代码将抛出 TypeError: __str__ returned non-string (type DataFrame) 因为 - 我猜 -
我正在研究 Python 元编程。 class FormMetaClass(type): def __new__(cls, clsname, bases, methods):
背景 我编写了一个修饰函数来修改给定类的 __repr__,这样当调用一个类实例时,它的所有属性都会打印给用户。当在下面示例中的 Container 类中使用时,装饰器 __repr__dec 的行为
我想自己写__repr__对于我定义的某些类。我希望它类似于默认的 ,除了那里有一些其他细节。我如何重现 东西? 最佳答案 参见 http://docs.python.org/reference/d
所以我有一个类方法,我想用它来绘制字典及其值: def __repr__ (self): for row in zip(*([ky]+map(str,val) for ky,val
处理持久化对象的 __repr__() 函数的最佳方法是什么?例如,表示数据库中的一行(关系或对象)。 根据 Python 文档,__repr__() 应该返回一个字符串,该字符串将使用 eval()
我正在开发一个主要返回闭包而不是传统的基于类的方法的 Python 项目。例如: def term(token): def fn(text): return (...)
这两种方法有区别吗? 例如, from datetime import date today = date(2012, 10, 13) repr(today) 'datetime.date(2012,
用成员变量x和y为类Foo实现__repr__,有没有办法自动填充字符串?无效的示例: class Foo(object): def __init__(self, x, y):
我有一个表示接口(interface)的抽象基类。此类的子类将此类的其他子类存储为属性。 例如: class AbstractBase(object): pass class Child(Ab
这个问题在这里已经有了答案: Purpose of __repr__ method? (6 个答案) 关闭 4 年前。 我正在尝试自己学习 python,但我坚持使用 __repr__ 函数。尽管我
我有以下(示例)代码: class _1DCoord(): def __init__(self, i): self.i = i def pixels(self):
print OBJECT 调用OBJECT.__str__(),那么什么时候调用OBJECT.__repr__()?我看到当 OBJECT.__str__() 不存在时 print OBJECT 调用
最近,__repr__() 遇到了很多麻烦。 , format() , 和编码。 应该输出__repr__()是编码还是 unicode 字符串? __repr__() 的结果是否存在最佳编码?在 P
def __repr__(self): return '' % ( self.__class__.__name__, self.urlconf_name, self.app_name,
( python 3.5.2) 我已经为我的一个类定义了 __repr__ 如下: class d(): def __init__(self): self._values =
我已经创建了我的 Node 和 Stack 类,但我不知道如何在 Stack 类中显示 repr 以便能够打印堆栈中当前的所有项目?我一直在尝试连接节点,但我不确定如何连接,因为 Stack() 不允
我通常写一个__repr__作为展示如何首先重新创建实例的一种方式。例如: class Component: def __init__(self, start, end): s
我是一名优秀的程序员,十分优秀!