1

私は、ユーザーがさまざまな言語を学ぶのを支援するためのPythonicコマンドライン「フラッシュカード」アプリに取り組んでいます。Pythonのcmdライブラリを使用して開発をスピードアップしたいと思います。特に興味深いのは、クラスのユーザーメソッドのドキュメント文字列を出力するcmd.Cmdクラスのdo_help()メソッドです。ただし、このアプリケーションは多言語であるため、言語固有のdocstringをドロップできるようにしたいと思います。

デコレータの使用に関するこのSOの質問を読みましたが、デコレータについてはほとんど知りません。デコレータについて学ぶことに多くの時間を費やす前に、デコレータが私の特定のジレンマに適しているかどうかを知りたいと思います。

皆さんはどう思いますか?この状況に対処するための最良の方法は何ですか?

私の問題についてもっと情報が必要な場合はお知らせください。

4

1 に答える 1

2

デコレータは、あなたがやりたいことだけでなく、それ以上のことを行うことができます。

デコレータ入門書

追加のボーナスとして、デコレータはさまざまな状況で非常に便利なツールです。彼らは本当にそれほど怖くないです。Essenceでは、これらは関数を引数として取り、関数を返す関数です。非常に単純な例は、呼び出しの結果を出力します。

>>> def my_decorator(function):
...  def inner_function(*args, **kwargs):
...    res = function(*args, **kwargs)
...    print("We have: "+res)
...    return res
...
>>> @my_decorator
... def add(x, y):
...  return x+y
...
>>> add(1,2)
We have: 3
3

これはと同等です

add = my_decorator(add)

あなたの問題のために、デコレータは単に__doc__関数のプロパティをオーバーライドする必要があります。

>>> def frenchmeup(fun):
...    fun.__doc__ = "Bonjour, documentation!"
...    return fun
... 
>>> @frenchmeup
... def foo():
...   """hello doc"""
...   return "world"
... 
>>> foo.__doc__
'Bonjour, documentation!'

デコレータに引数を渡す

関数ごとにデコレータを作成する必要がある場合、これはかなり面倒です。ドキュメント辞書を使用すると、一般的なソリューションを簡単に開発できます。

>>> ttable = {
...   "FR" : {
...     "hello doc": "Bonjour, documentation!"
...   }
... }
>>> def document(lang=None):
...   def doc_decorator(function):
...     if lang and lang in ttable:
...       function.__doc__ = ttable[lang][function.__doc__]
...     return function
...   return doc_decorator
... 
>>> @document(lang="FR")
... def foo():
...   """hello doc"""
...   return 42
... 
>>> foo.__doc__
'Bonjour, documentation!'

デコレータが関数によってどのように生成されるかではありません。これはより複雑ですが、デコレータに引数を渡す機能を提供します。

個人的なメモとして、これがクリックされるまでに少し時間がかかりましたが、現在はPythonコードで定期的に使用しています。

自動docstring翻訳の戦略

モジュールでdocstringを検査することにより、実際にプログラムでドキュメント辞書を生成できます。

コメントから:

辞書はdocstringから自動的に生成され、翻訳者に渡されるという考え方です。正規の(英語?)docstringを変更した場合は、翻訳も変更する必要があります。古い変換テーブルを新しく生成されたテーブルと比較することにより、正規のdocstringが変更されていない変換を再挿入できます。新しいdocstringの翻訳を追加するだけで済みます。

したがって、たとえば、foo()docstringを変更した後"""goodbye, doc..."""、テーブルジェネレータを再実行すると、古い「hello doc」キーが欠落している新しいテーブルが取得("goodbye, doc...", "")され、変換テーブルに新しいキーと値のペアが含まれます。

help_<cmd>()cmdモジュールのスタイルを使用する代替手段

ドキュメントにcmdhelp_<cmd>()モジュールのスタイルを使用したい場合は、翻訳を辞書に保存し、ヘルプコマンドのLANG変数に基づいて正しい翻訳を印刷するという同じ原則を使用できます。

于 2012-04-02T09:42:54.883 に答える