首页 文章

如何让docstring尊重PEP257,同时可以使用docopt来使用gettext来符合i18n?

提问于
浏览
4

根据PEP 257命令行脚本的docstring应该是它的用法消息:

脚本(独立程序)的docstring应该可用作其“用法”消息,当使用不正确或缺少的参数调用脚本时打印(或者可能使用“-h”选项,用于“帮助”) . 这样的docstring应该记录脚本的功能和命令行语法,环境变量和文件 . 用法消息可以相当复杂(几个屏幕已满),并且应该足以让新用户正确使用该命令,以及对复杂用户的所有选项和参数的完整快速参考 .

并且docstring应该是作为模块级别的第一个字符串,在其他任何东西之前,作为 __doc__ 可用 .

现在,我也使用docopt作为用法消息解析器,所以我只需编写doc字符串,它就是's building the command line parser on its own, and that' .

_("""...""")

's not that great, is that I can'找到一种方法将文档字符串标记为get18的i18nable,因此我可以在给予 docopt 时将其转换为其他语言 . 当时我得到的唯一解决方案是在翻译所有应用程序的其他字符串时,使用和帮助消息保持英文!

正如PEP 20所述:

应该有一个 - 最好只有一个 - 显而易见的方法 . 虽然这种方式起初可能并不明显,除非你是荷兰人 .

什么是解决无法将文档字符串标记为可翻译优雅的限制的最佳方法?

N.B . :这里我们认为我正在 __init__.py 模块中执行 gettext.install() ,以便在解析 __doc__ 之前,内部存在 _() .

3 回答

  • 0

    其他方式:

    if __name__ == "__main__":
        if hasattr(vars()['__builtins__'], '_') and not 'NullTranslations' in str(_):
            args = docopt.docopt(_("USAGE MESSAGE"))
        else:
            args = docopt.docopt(__doc__)
    

    这不是使用异常,而是使用方法的字符串表示形式进行键入测试,并在内置模块中查找该方法...这并不比其他选项更好 .

    那个也是一个非常糟糕和不优雅的黑客,因为翻译人员必须参考源代码来查找文档字符串 . 或者我必须在代码中有两次docstring的内容 .

  • 1

    目前,这是一个我正在考虑的解决方案:

    """\
    This is the docstring
    """
    
    import docopt
    if __name__ == "__main__":
        try:
            args = docopt.docopt(_("{docstring}").format(docstring=__doc__))
        except KeyError:
            args = docopt.docopt(_("{docstring}")) # string which will be replaced by the i18ned one.
    

    我没有找到那么优雅,因为即使python中的例外是可以的,我认为它们应该被保留用于特殊情况而不是应用程序的用例 .

    它也是一个非常顽皮的黑客,它将在gettext中获取docstring格式而不是 __docopt__ 文本,这将无法帮助翻译,因为他们将不得不回到源代码...

  • 1

    我终于找到解析文档字符串的唯一好方法:

    -D
    --docstrings
        Extract module, class, method, and function docstrings.  These do
        not need to be wrapped in _() markers, and in fact cannot be for
        Python to consider them docstrings. (See also the -X option).
    

    将提取所有文档字符串 . 因此,唯一需要翻译的内容可以使用以下方式进行翻译:

    args = docopt.docopt(_(__doc__))
    

相关问题