如何使用dapr python sdk的add_或update_state函数?

2024-04-25 08:49:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在不覆盖现有密钥的情况下更新给定的state_名称;set_state和save_state函数的组合始终覆盖所有键

函数add_或_update似乎可以满足我的需要;updateif exists类型逻辑,尽管我似乎无法理解update\u value\u工厂参数

有人能提供一个添加或更新功能的工作示例吗

https://github.com/dapr/python-sdk/blob/master/dapr/actor/runtime/state_manager.py

async def add_or_update_state(
            self, state_name: str,
            value: T, update_value_factory: Callable[[str, T], T]) -> T:
        if not callable(update_value_factory):
            raise AttributeError('update_value_factory is not callable')

        if state_name in self._state_change_tracker:
            state_metadata = self._state_change_tracker[state_name]
            if state_metadata.change_kind == StateChangeKind.remove:
                self._state_change_tracker[state_name] = \
                    StateMetadata(value, StateChangeKind.update)
                return value
            new_value = update_value_factory(state_name, state_metadata.value)
            state_metadata.value = new_value
            if state_metadata.change_kind == StateChangeKind.none:
                state_metadata.change_kind = StateChangeKind.update
            self._state_change_tracker[state_name] = state_metadata
            return new_value

        has_value, val = await self._actor.runtime_ctx.state_provider.try_load_state(
            self._type_name, self._actor.id.id, state_name)

        if has_value:
            new_value = update_value_factory(state_name, val)
            self._state_change_tracker[state_name] = \
                StateMetadata(new_value, StateChangeKind.update)
            return new_value
        self._state_change_tracker[state_name] = \
            StateMetadata(value, StateChangeKind.add)
        return value