如何将用户设置存储在 Calibre 的插件中?
How one can store user's settings in Calibre's plugin?
我正在开发 Calibre 的插件,我想存储用户设置(例如,如果插件应该进行 post- 从一种格式到另一种格式的导入转换 - 在我的
案例:pdf
到 djvu
)。
如何存储用户设置? Calibre 是否有内置方法来执行此操作?
例如,我有一个字典 prefs_org_dict
,其中的键和值表示用户设置的首选项。我怎样才能可靠地存储这些数据并在以后读取它?
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
但此方法有一些注意事项:
设置文件的名称。释义手册:
Remember that this name (i.e. 'plugins/PLUGINNAME'
) is also in a global namespace, so make it as unique as possible. You should always prefix your config file name with plugins/
, so as to ensure you don't accidentally clobber a calibre config file.
将任何内容保存到该对象后,您可以在 Calibre 插件的 config folder 中看到您的 PLUGINNAME.json
文件(对于 Windows:%APPDATA%\calibre\plugins
)(您可以获取此路径以编程方式使用:from calibre.utils.config import config_dir
并附加 /plugins
).
默认设置。
prefs.defaults
is a dictionary which value is returned 如果您的 prefs
对象中不存在给定的键。所以你可以为你的插件设置创建一些默认值,例如:
prefs.defaults['postimport'] = False
主要问题是,当您尝试使用其他 dict 方法(例如 .values()
、.items()
或 .iteritems()
时,它们 return "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 只接受字符串。
我正在开发 Calibre 的插件,我想存储用户设置(例如,如果插件应该进行 post- 从一种格式到另一种格式的导入转换 - 在我的
案例:pdf
到 djvu
)。
如何存储用户设置? Calibre 是否有内置方法来执行此操作?
例如,我有一个字典 prefs_org_dict
,其中的键和值表示用户设置的首选项。我怎样才能可靠地存储这些数据并在以后读取它?
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
但此方法有一些注意事项:
设置文件的名称。释义手册:
Remember that this name (i.e.
'plugins/PLUGINNAME'
) is also in a global namespace, so make it as unique as possible. You should always prefix your config file name withplugins/
, so as to ensure you don't accidentally clobber a calibre config file.将任何内容保存到该对象后,您可以在 Calibre 插件的 config folder 中看到您的
PLUGINNAME.json
文件(对于 Windows:%APPDATA%\calibre\plugins
)(您可以获取此路径以编程方式使用:from calibre.utils.config import config_dir
并附加/plugins
).默认设置。
prefs.defaults
is a dictionary which value is returned 如果您的prefs
对象中不存在给定的键。所以你可以为你的插件设置创建一些默认值,例如:prefs.defaults['postimport'] = False
主要问题是,当您尝试使用其他 dict 方法(例如
.values()
、.items()
或.iteritems()
时,它们 return "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 只接受字符串。