我的列表如何成为 ObservedList?复制数据库的问题

我在 repl.it 上制作不和谐机器人时遇到问题,我的列表是“ObservedList”,我不知道该怎么做,当我观看一些教程时,它总是只是一个普通列表

from replit import db

db['fruits'] = ['apple','banana']
print(db['fruits'])

输出:

ObservedList(value=['apple', 'banana'])
stack overflow How does my list become ObservedList? Problem with replit db
原文答案

答案:

作者头像

在上一个答案中提供的链接中四处寻找时,我在 init 函数中发现了一些有趣的东西。

def __init__(
    self, on_mutate: Callable[[List], None], value: Optional[List] = None
) -> None:
    self._on_mutate_handler = on_mutate
    if value is None:
        self.value = []
    else:
        self.value = value

如果您想在名为 foo 的 ObserverdList 中获取列表,请使用 foo.value 来执行此操作。

例如:

Output = [“Apple”, “Banana”] + db[“foo”].value

假设 db[“foo”] 中的 ObservedList 只是 [“Cantaloupe”],则返回值为 [“Apple”]

作者头像

ObservedListreplit package 中的一个类

如前所述 in the docstring 它是

每次变异时调用函数的列表。

还有 ObservedDict 类。

this tutorial 在底部的“高级用法”部分提供了更多信息:

您可能遇到的另一个问题与突变功能有关。 在幕后,此功能通过将原始列表和字典类替换为侦听突变的特殊替换,即replit.database.database.ObservedList和replit.database.ObservedDict来工作。

要对这些值进行 JSON 编码,请使用 replit.database.dump 方法。对于 Web 框架中的 JSON 响应,这是自动完成的。

要将这些类转换为其原始等价物,请访问 value 属性。提供了一个自动执行此操作的函数:replit.database.to_primitive。

要完全避免这种行为,请改用 get_raw 和 set_raw 方法。

作者头像

目前,您要求机器人打印整个列表。如果您将代码更改为:

print(db['fruits'][0])

输出将是

apple

这是一个相当古老的问题,但我希望这能简单地回答这个问题。