如何将用户设置存储在 Calibre 的插件中?

How one can store user's settings in Calibre's plugin?

我正在开发 Calibre 的插件,我想存储用户设置(例如,如果插件应该进行 post- 从一种格式到另一种格式的导入转换 - 在我的 案例:pdfdjvu)。

如何存储用户设置? 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

但此方法有一些注意事项:

  1. 设置文件的名称。释义手册:

    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).

  2. 默认设置。

    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()
    []
    
  3. 提交嵌套字典。

    如果您想使用 JSONConfig 对象作为真正的 .json 存储,您可能需要使用嵌套字典。例如:

    prefs['pdf'] = {}
    prefs['pdf']['convert'] = True
    

    但是,如果您将值设置(或删除)到嵌套字典 prefs['pdf'],它 will not 将保存到 .json 文件。你必须:

    prefs.commit()
    

    将数据设置为嵌套字典后保存到文件。

  4. JSON 格式的限制。

    一些 Python 功能无法转换为 JSON 格式,例如JSON 没有元组,所以 json.dumps translates 元组到数组。同样在 Python 中,您可以将每个可哈希对象(例如元组或冻结集)作为键。 JSON 只接受字符串。