我遇到了一个问题:我需要创建一个用户身份证,在其中添加一些信息,如姓名、姓氏、年龄等。
我尝试在mycroft的主级别添加一个自定义文件userinfo.conf,并在configuration.py、locations.py和init.py中添加一个类来加载这个配置文件与其他mycroft配置文件。
加载工作得很好,我只是使用configuration.py中现有的类来创建一个类来加载文件。
但是我在自己配置文件中保存信息的一致性上遇到了麻烦。
让我解释一下:如果我有一个技能来设置用户的姓名,该技能会使用MycroftSkill(config_core)提供的字典来设置用户的姓名,然后调用configuration.py类中的自己的方法将这些信息保存到自己的配置文件中。
但问题是,导致MycroftSkill保存配置信息的字典不是静态的。如果更改了该字典中的值,其他所有技能都无法看到新值,因为它们在创建时加载配置信息,即调用MycroftSkill构造函数的地方。
我需要一种所有技能都能看到且在整个技能中保持一致的东西,这样如果某个技能更改了相同的值,那么其他所有技能都能看到它。
我知道所有技能都有一个配置文件来保存一些值,但如果我有一个用于姓名的技能,一个用于年龄的技能等等,并且我将每个信息保存在适当的技能配置文件中,那么访问这些信息是非常无用的,因为我将这些信息分散在不同的技能配置文件中。
解决这个问题的正确方法是什么?我也想避免每次需要读取某些信息时都访问这个假设的文件。例如,如果所有的技能都使用姓名值在互动过程中称呼用户,我不希望每个技能每次都打开一个流来读取该值。
出于这个原因,我试图利用mycroft关于配置的模式。
5条答案
按热度按时间fjaof16o1#
我建议你不要编辑这样一件小事的源代码。
也许可以查看 https://github.com/HelloChatterbox/json_database,但为了回答你的问题,你可以发送一个总线消息
"configuration.patch", {"config": new_config}
,该消息会更新我croft中的所有配置(不会保存到磁盘)。8oomwypt2#
我同意你的观点。
我尝试了这个解决方案,但我不想强制改变Mycroft的自然行为,所以我重新审视了我的做法。
为了重新加载配置,我使用了"Configuration.patch()",但这种方法也改变了Mycroft的自然行为,这意味着每次技能调用这个配置函数时都会发生变化。
出于好奇,关于消息总线,你能解释得更清楚一些吗?我需要传递什么值作为"config"和"new_config"?
关于JSON数据库的问题,我的困惑在于如何在各个技能之间共享这个数据库,并确保在每个时刻这个数据库都是一致的,即使某个技能修改了一些值。
7gyucuyw3#
你应该能够像这样从技能中做:
导入Message类
然后在你的技能的initialize方法中有
flvlnr444#
我正在考虑创建一个扩展MycroftSkill Class的技能类,并在其中包含一个仅包含我需要的用户信息的静态字典,以及一个用于加载和写入文件信息的方法。
这样,我只需要将这个myclass放在Mycroftskill相同的文件夹中,这样所有技能都可以查看它并扩展它。
由于字典是静态的,所有技能在任何时候都具有相同的值,即使另一个技能修改了字典中的一个值。
kqqjbcuj5#
这听起来像是对PR #1822中提出的技能API的一个很好的利用。
而不是将数据结构提供给所有技能,你可以公开一个API来与之交互。
这是否解决了你正在考虑的使用案例?