gpt4 book ai didi

python - 子类化 int 以允许 "unknown"值

转载 作者:太空宇宙 更新时间:2023-11-03 13:19:30 27 4
gpt4 key购买 nike

我有点被困在这里了。我基本上处于试验阶段,我想知道我是否可以将 int 子类化,这样它就可以像您的旧 int 一样工作,除了您将能够分配一个“未知”值,在算术运算的情况下,将充当 1。

所以我可以说:

>>> uint(5) + 5
10
>>> uint('unknown')
unknown
>>> int(uint('unknown'))
1
>>> uint('unknown') + 5
6
>>>

事实上,它在某种程度上类似于 float('inf') 的工作方式,只是我只需要整数加上单个“特殊”值。

我想象的工作应该是这样的:

class uint(int):

def __init__(self, value):
self.value = value
self.unknown = self.value == "unknown"

def __int__(self):
return 1 if self.unknown else self.value

def __str__(self):
return "unknown" if self.unknown else str(self.value)

但是当我尝试将其实例化为 uint('unknown') 时,此示例抛出 ValueError: invalid literal for int() with base 10: 'unknown'

这可能吗?我该怎么做?


背景级别 1

万一有人问,背景是我有一个可迭代对象列表,我想使用 itertools.product 创建一个新的。但在此之前,我想利用 __len__,以防某些迭代器实现它,以便能够猜测最终元素的(最小)数量。因此,就最终数字而言,对于那些没有 __len__ 的可迭代对象,我假设为 1。

我想用 class uint(int) 这样做的原因是我希望能够安全地公开单独的计数(以便有人可以在日志中推送类似这样的内容:“正在加载( 1500 = 10 * 10 * 未知 * 15) 个元素”,并且仍然传递其中一些是“未知”的信息。

背景级别 2

我实际上很喜欢这样一种情况,当 a 库提供此类用于定义可迭代对象的 __len__ 时,它们可以返回基于“最小值”、“最大值”或“最佳猜测”,同时仍然不会被它在一些简单数学中的进一步使用所困扰。

>>> count = uint(100, 'minimum')
>>> print count
"minimum of 100"
>>> count * 20
2000
>>>

想象一个带有迭代器的对象读取一个巨大的文件:为什么对象不能说“好吧,文件是 400 MiB,所以至少会有 4,000 条记录”?

所以一个额外的问题:什么更简单:子类化 int 或创建一个新类但必须实现和维护算术运算的接口(interface)?

最佳答案

我认为有些概念性问题比实现问题更重要。

将“未知值”视为 1 使它们不是真正未知的。类比 float ,有一个定义明确的"Not a Number"。它将参与数学运算,但在大多数情况下会产生 NaN。例如:

>>> f = float('NaN')
>>> 42 * f
nan

这是一件好事,因为 NaN 实际上不是一个数字,因此使用它的算术不应生成看似有效的结果。如果您按照建议实现“未知整数”,未知值将产生无意义的结果。例如:

>>> u = uint('unknown')
>>> 42 * u
42

你得到了一个正确的整数,但这真的是你想要的语义吗?另一个类似的情况是除以零,这在数学上是未定义的。任何可以拼凑到位的值都会产生数学上的荒谬之处。因为 (x/y) * y == x(当且仅当 y != 0)你可能期望:

>>> (42 / 0) * 0   # this doesn't really work
42

但是如果不破坏数学就无法做到这一点。

关于python - 子类化 int 以允许 "unknown"值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18966643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com