我正在开发一个Calibre的插件,我想存储用户设置(例如,如果插件应该从一种格式转换到另一种格式 - 在我的
案例:pdf
到djvu
)。
如何存储用户设置? Calibre是否有内置方法来执行此操作?
例如,我有一个字典prefs_org_dict
,其中的键和值表示用户设置的首选项。如何可靠地存储这些数据并在以后阅读?
答案 0 :(得分:1)
manual建议的方法是创建JSONConfig
对象并在其中存储用户首选项。
基本上只是:
import os
from calibre.utils.config import JSONConfig
prefs = JSONConfig(os.path('plugins', 'PLUGINNAME'))
# JSONConfig inherits after Dict so use it as dictionary
for key, val in prefs_org_dict.iteritems():
prefs[key] = val
prefs.commit() # explanation in 3rd section of this post
但是这种方法有一些注意事项:
设置文件的名称。释义手册:
请记住,此名称(即
'plugins/PLUGINNAME'
)也位于全局命名空间中,因此请尽可能使其唯一。您应该始终在配置文件名前添加plugins/
前缀,以确保您不会意外地破坏口径配置文件。
将任何内容保存到此对象后,您可以在Calibre的插件config folder内找到PLUGINNAME.json
文件(适用于Windows:%APPDATA%\calibre\plugins
)(您可以获得)此路径以编程方式使用:from calibre.utils.config import config_dir
并附加/plugins
)。
默认设置。
prefs.defaults
是一个字典,如果给定的密钥不存在于prefs
对象中,则该值为returned。因此,您可以为插件的设置创建一些默认值,例如:
prefs.defaults['postimport'] = False
主要问题是,当您尝试使用其他dict方法时,例如.values()
,.items()
或.iteritems()
,它们将返回" real" prefs
,而非默认值,例如,如果prefs['postimport']
未进一步定义,则为
>>> prefs.defaults['postimport']
False
>>> prefs.defaults.items()
[('postimport', False)]
>>> prefs['postimport']
False
>>> prefs.items()
[]
提交嵌套字典。
如果要将JSONConfig
对象用作真正的.json
存储,则可能需要使用嵌套字典。例如:
prefs['pdf'] = {}
prefs['pdf']['convert'] = True
但是,如果您将值设置(或删除)为嵌套字典prefs['pdf']
,则will not将保存到.json
文件。你必须:
prefs.commit()
将数据设置为嵌套字典后保存到文件。
JSON格式的约束。
一些Python功能无法转换为JSON格式,例如JSON没有元组,所以json.dumps
translates元组到数组。同样在Python中,您可以将每个可清除对象(例如元组或冻结集)作为键。 JSON只接受字符串。