4

根据PEP 257,命令行脚本的文档字符串应该是它的使用信息:

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

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

现在,我还使用docopt消息解析器,所以我只需要编写文档字符串,它自己构建命令行解析器,这很棒。

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

不是那么好,是我找不到将文档字符串标记为 gettext 的 i18nable 的方法,因此我可以在将其转换为其他语言时将其转换为docopt. 当时我得到的唯一解决方案是在翻译所有应用程序的其他字符串时,使用法和帮助消息保持为英文!

正如PEP 20所述:

应该有一种——最好只有一种——明显的方法来做到这一点。
虽然这种方式一开始可能并不明显,除非你是荷兰人。

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

注意:在这里,我们认为我正在模块中进行操作gettext.install()__init__.py以便在解析_()之前就存在于内置函数中。__doc__

4

3 回答 3

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 中是可以的,我认为它们应该被保留用于一些特殊的东西,而不是应用程序的用例中的东西。

这也是一个非常顽皮的 hack,它将在 gettext 中获取 docstring 格式,而不是__docopt__文本,这对翻译人员没有帮助,因为他们必须回到源代码......

于 2014-05-16T14:26:55.667 回答
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__))
于 2014-05-21T13:47:58.597 回答
0

另一种方式:

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

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

这也是一个非常糟糕和不雅的hack,因为翻译人员必须参考源代码来查找文档字符串。或者我必须在代码中包含两倍于文档字符串的内容。

于 2014-05-16T14:42:31.543 回答