4

PEP 257によると、コマンド ライン スクリプトの docstring はその使用法メッセージである必要があります。

スクリプト (スタンドアロン プログラム) の docstring は、その "使用法" メッセージとして使用できる必要があります。これは、スクリプトが誤った引数または欠落した引数 (または、"help" の場合は "-h" オプション) で呼び出されたときに出力されます。このような docstring は、スクリプトの関数とコマンド ライン構文、環境変数、およびファイルを文書化する必要があります。使用方法のメッセージはかなり複雑 (数画面いっぱい) で、新しいユーザーがコマンドを適切に使用するのに十分なだけでなく、上級ユーザー向けのすべてのオプションと引数の完全なクイック リファレンスでもあります。

そして、docstring は、何よりも前に、モジュール レベルとして利用できる最初の文字列でなければなりません__doc__

現在、docopt使用法メッセージ パーサーとしても使用しているため、ドキュメント文字列を記述するだけで、コマンド ライン パーサーが独自に構築されます。これは素晴らしいことです。

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

それほど素晴らしいことではありませんが、docstring を gettext の i18nable としてマークする方法が見つからないため、 に指定すると他の言語に変換できdocoptます。現時点で私が得た唯一の解決策は、アプリケーションの他のすべての文字列が翻訳されているときに、使用法とヘルプメッセージを英語のままにすることです!

PEP 20が述べているように:

それを行う明白な方法が 1 つ (できれば 1 つだけ) ある必要があります。
あなたがオランダ人でない限り、その方法は最初は明白ではないかもしれませんが.

ドキュメントストリングをエレガントに翻訳可能としてマークできないという制限を回避する最善の方法は何でしょうか?

注意: ここでは、解析される前にビルトインに存在するようgettext.install()に、__init__.pyモジュール内で実行していると考えています。_()__doc__

4

3 に答える 3

1

私は最終的に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__))
于 2014-05-21T13:47:58.597 に答える
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では例外は問題ありませんが、アプリケーションのユースケースではなく、例外的なもののために保持する必要があると思うので、それはエレガントではありません。

また、__docopt__テキストの代わりに gettext で docstring 形式を取得するかなりいたずらなハックでもありますが、ソース コードに戻らなければならないため、翻訳者の助けにはなりません...

于 2014-05-16T14:26:55.667 に答える
0

別の方法:

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

これは例外を使用していませんが、メソッドの文字列表現を使用して入力をテストし、組み込みモジュールでそのメソッドを検索します...これは他のオプションよりも実際には優れていません.

また、翻訳者はドキュメント文字列を調べるためにソース コードを参照する必要があるため、これも非常に悪質で洗練されていないハックです。または、コード内の docstring の内容の 2 倍が必要になります。

于 2014-05-16T14:42:31.543 に答える