Python 如何让docstring尊重PEP257,同时使用gettext与docopt配合使用以符合i18n的要求?

Python 如何让docstring尊重PEP257,同时使用gettext与docopt配合使用以符合i18n的要求?,python,internationalization,gettext,docstring,docopt,Python,Internationalization,Gettext,Docstring,Docopt,根据命令行脚本的docstring,应该是它的用法消息: 脚本(独立程序)的docstring应可用作其“用法”消息,在使用不正确或缺少的参数调用脚本时打印(或者使用“-h”选项,用于“帮助”)。这样的docstring应该记录脚本的函数和命令行语法、环境变量和文件。使用消息可以相当详细(几个屏幕都满了),应该足以让新用户正确使用该命令,并为复杂用户提供所有选项和参数的完整快速参考 而docstring应该是模块级的第一个字符串,在其他任何内容之前,可以作为\uuuuu doc\uuuu使用 现

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

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

而docstring应该是模块级的第一个字符串,在其他任何内容之前,可以作为
\uuuuu doc\uuuu
使用

现在,我还将其用作用法消息解析器,所以我只需要编写doc字符串,它自己构建命令行解析器,这很好

_("""...""")
不太好的是,我找不到一种方法将docstring标记为i18nable for gettext,因此当给定给
docopt
时,我可以将其转换为其他语言。当时,我得到的唯一解决方案是在翻译所有应用程序的其他字符串时,使用法和帮助消息保持英文

作为缔约国:

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

克服无法优雅地将docstring标记为可翻译的限制的最佳方法是什么


N.B.:在这里,我们考虑在Ayth-IntIy.Py < /Cult>模块中执行<代码> >()/代码>,使<代码> >(或代码>)出现在建造者之前,甚至<代码>

"""\
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格式,而不是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

if __name__ == "__main__":
    if hasattr(vars()['__builtins__'], '_') and not 'NullTranslations' in str(_):
        args = docopt.docopt(_("USAGE MESSAGE"))
    else:
        args = docopt.docopt(__doc__)
它不使用异常,但使用方法的字符串表示形式测试键入,并在内置模块中查找该方法。。。这并不比另一种选择好


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

我终于找到了解析docstring的唯一好方法:

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

我怀疑使用信息的国际化必须得到
docopt
的支持。你看过源代码了吗?也许你可以自己做修改,提交一个向上游合并的请求。好吧,我还没有考虑这个问题,因为我从来没有想过我会是第一个解决这个问题的人:-)如果真的没有办法,我会发送一个补丁!在浏览并与一些朋友聊天之后,实际上,修补python以支持标记docstring是不可能的。因为docstring是在编译时进行计算的,而
\
是一个函数,因此在运行时进行计算,这意味着将docstring移动到运行时计算,可能会产生一系列后果。哪个命令使用此参数,该命令的文档在哪里?我得说那是很久以前的事了,因此,我不得不再次查找,以了解我所说的内容^^^因此,这是针对工具的!