gpt4 book ai didi

python - 用数据模型方法覆盖 * 和 ** 解包?

转载 作者:行者123 更新时间:2023-12-04 14:47:14 29 4
gpt4 key购买 nike

我正在尝试弄清楚如何赋予对象解包值的能力。

我想出的用例如下:

  • 让我们有一个 Interval 类,我们将使用它来评估实值函数。
  • 我们想问
    • 成员资格,因此 __contains__
    • 通过调用特定步骤或仅使用默认步骤对其进行迭代,因此 __call____iter__
  • 以后我会支持并集和交集。

我正在寻找的功能之一是能够调用 Interval 对象并将其解压缩,这样如果 I = Interval(1, 2)a, b = *I 然后 a == 1b == 2

这主要用于在参数中具有间隔限制函数

例如一个函数 def Integrate(f, a, b): ... 然后我们评估,integral = Integrate(f, *I) 其中 $ f$ 实值函数和 I 是我们正在讨论的区间。

问题是我不完全确定应该使用哪种数据模型方法。

到目前为止,我提出的示例类如下。

class Interval:
def __init__(self, a, b):
if a >= b:
raise Exception("Invalid values for an interval")
self.upper = b
self.lower = a

def __contains__(self, value):
return self.lower <= value <= self.upper

def __call__(self, h=_h):
yield from dense_range(self.lower, self.upper, h)

def __iter__(self):
return self()

def __repr__(self):
return f"<Interval [{self.lower}, {self.upper}]>"

有什么想法吗?

最佳答案

我没有很多实现迭代器的经验,但我相信你所需要的只是从 __iter__ 中产生相关的项目:

class Interval:
def __init__(self, a, b):
if a >= b:
raise Exception("Invalid values for an interval")
self.upper = b
self.lower = a

def __contains__(self, value):
return self.lower <= value <= self.upper

def __call__(self, h=_h):
yield from dense_range(self.lower, self.upper, h)

def __iter__(self):
yield self.lower
yield self.upper

def __repr__(self):
return f"<Interval [{self.lower}, {self.upper}]>"

一些用途:

In [5]: interval = Interval(1, 7)

In [6]: a, b = interval

In [7]: a
Out[7]: 1

In [8]: b
Out[8]: 7

In [9]: [*interval]
Out[9]: [1, 7]

In [10]: [value for value in interval]
Out[10]: [1, 7]

In [11]: dict(zip("ab", interval))
Out[11]: {'a': 1, 'b': 7}

In [12]: a, b, *c = interval

In [13]: a
Out[13]: 1

In [14]: b
Out[14]: 7

In [15]: c
Out[15]: []

In [16]: a, *b, c = interval

In [17]: a
Out[17]: 1

In [18]: b
Out[18]: []

In [19]: c
Out[19]: 7

关于python - 用数据模型方法覆盖 * 和 ** 解包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69804766/

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