英文:
Trying to form a Multirange with two Range objects
问题
根据文档,
https://access.crunchydata.com/documentation/psycopg3/3.1.4/
psycopg3 Range 是:
范围对象是不可变的、可哈希的,并支持 in 运算符(检查元素是否在范围内)。
但是在 Python 中,我想将两个 Range 连接成一个 psycopg3 Multirange。我知道 Range(与小写 'r' 范围不同)在 Python 中的功能有限。
我该如何做到这一点?
请注意,这是在 foo 是一个 psycopg3 MultiRange 对象的情况下有效。
foo.append(newrange)
我可以在 MultiRange 对象的末尾添加一个 Range 对象。
这是一种尝试将一个 Range 对象连接到另一个以创建 MultiRange 的方法。
from itertools import chain
t = Range(300, 400)
newrange = Range(2900, 4300)
print("Newrange data and type", newrange, type(newrange))
mt = chain(t, newrange)
print(mt, type(mt))
print(sorted(mt)) # 如果尝试使用 'list' 而不是 'sorted' 会出现相同的错误
输出:
Newrange data and type [2900, 4300) <class 'psycopg.types.range.Range'>
<itertools.chain object at 0x7fd30892fd60> <class 'itertools.chain'>
Traceback (most recent call last):
File "range_agg_test.py", line 95, in <module>
print(sorted(mt))
TypeError: 'Range' object is not iterable
有没有办法创建一个 MultiRange,给定两个 Range?
英文:
According to the docs,
https://access.crunchydata.com/documentation/psycopg3/3.1.4/
The psycopg3 Range is:
Range objects are immutable, hashable, and support the in operator (checking if an element is within the range).
However in Python I would like to concatenate two Range into a psycopg3 Multirange.
I know the Range (as opposed to small case 'r' range) has limited functionality in Python.
How can I do that?
Note this is valid where foo is a psycopg3 MultiRange object.
foo.append(newrange)
I am allowed to tack on a Range object at the end of a MultiRange object.
Here is an attempt to tack one Range object after another to create a MultiRange.
```from itertools import chain
t = Range(300,400)
newrange = Range(2900,4300)
print("Newrange data and type", newrange, type(newrange))
mt = chain(t, newrange)
print(mt, type(mt))
print(sorted(mt)) # same error if I try 'list' instead of 'sorted'
```
Output:
```Newrange data and type [2900, 4300) <class 'psycopg.types.range.Range'>
<itertools.chain object at 0x7fd30892fd60> <class 'itertools.chain'>
Traceback (most recent call last):
File "range_agg_test.py", line 95, in <module>
print(sorted(mt))
TypeError: 'Range' object is not iterable```
Is there any way to accomplish the creation of a MultiRange given 2 Ranges?
答案1
得分: 0
我需要初始化一个新的 MultiRange 对象如下:
newbie = Multirange()
newbie.append(newrange)
newbie.append(t)
如果业务领域要求 MultiRange 严格升序,通常情况下,开发人员需要确保 newrange 和 t 的顺序正确,因为 append 语句不会进行检查。
英文:
After some fumbling I realized I needed to initialize a new MultiRange object as follows
newbie = Multirange()
newbie.append(newrange)
newbie.append(t)
If the business domain requires the MultiRange be strictly ascending, as is usual, it is up to the developer to make sure newrange and t are in the right order, because the append statements do not check.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论