を探していたものでなければ教えてくださいとしては、関数名は、グローバル()ディレクトリ内の動的な検索で使用して、何度も指摘しました。これは、定義のモジュールでのみ機能し、グローバル関数でのみ機能します。
def foo():
""" this is foo """
doc = foo.__doc__
class Foo:
def bar(self):
""" this is bar """
doc = Foo.bar.__doc__
に相当します。これらの名前はかなり長く得ることができるよう、非常に面倒です - あなたはメンバ関数のドキュメンテーション文字列を知りたい場合は、クラス名からパスを検索する必要があります
def foo():
""" this is foo """
doc = globals()["foo"].__doc__
class Foo:
def bar(self):
""" this is bar """
doc = globals()["Foo"].bar.__doc__
あなたは、呼び出し元のドキュメンテーション文字列を検索したい場合は、あなたの印刷ヘルパーは完全に異なるグローバル()の辞書と完全に別のモジュールに住んでいる可能性があるとして、それはとにかく動作しません。唯一の正しい選択はスタックフレームを調べることですが、Pythonでは関数オブジェクトが実行されるわけではなく、 "f_code"コードオブジェクトへの参照しかありません。しかし、その関数の "f_globals"への参照があるので、続けてください。だから、あなたはこのような呼び出し元のドキュメントを取得する関数を書くことができ、そのバリエーションとして、独自のドキュメント文字列を得ることができます。
import inspect
def get_caller_doc():
frame = inspect.currentframe().f_back.f_back
for objref in frame.f_globals.values():
if inspect.isfunction(objref):
if objref.func_code == frame.f_code:
return objref.__doc__
elif inspect.isclass(objref):
for name, member in inspect.getmembers(objref):
if inspect.ismethod(member):
if member.im_func.func_code == frame.f_code:
return member.__doc__
とのそれをテストするために行ってみましょう:この出力の
def print_doc():
print get_caller_doc()
def foo():
""" this is foo """
print_doc()
class Foo:
def bar(self):
""" this is bar """
print_doc()
def nothing():
print_doc()
class Nothing:
def nothing(self):
print_doc()
foo()
Foo().bar()
nothing()
Nothing().nothing()
# and my doc
def get_my_doc():
return get_caller_doc()
def print_my_doc():
""" showing my doc """
print get_my_doc()
print_my_doc()
結果
this is foo
this is bar
None
None
showing my doc
は実際には、ほとんどの人は、唯一の引数としてそれを伝承するために、独自のドキュメンテーション文字列をしたいです、呼び出されたヘルパー関数はそれ自身ですべてを調べることができます。私はunittestコードでこれを使用していますが、これは時にはいくつかのログを埋めるか、またはdoc文字列をテストデータとして使用するのに便利です。これは、提示されたget_caller_doc()がテストクラスのグローバルテスト関数とメンバ関数だけを探す理由ですが、ドキュメント文字列について知りたいと思うほとんどの人にとっては十分だと思います。 sys._getframeと適切get_frame_doc(フレーム)を定義する
class FooTest(TestCase):
def get_caller_doc(self):
# as seen above
def test_extra_stuff(self):
""" testing extra stuff """
self.createProject("A")
def createProject(self, name):
description = self.get_caller_doc()
self.server.createProject(name, description)
(1))(読者に残されます。
私はあなたの装飾方法が本当に好きです。フレームインスペクションよりもはるかに難しく、危険性も低く、また、関数名の使用を避けることができます。 Slick!アップアップされました! – FlipMcF
ありがとう、ありがとう。 :-) – kindall
最後のコードスニペットの* my_funcの引数リストに* argsと** kwargsを入れてはいけませんか?あるいは、プログラマが関数定義に必要な追加の引数を置くことができたにもかかわらず、単に追加の引数が省略されました。私はそれが明確ではないと確信していますが、それは "最初の議論"というテキストで言います。 – RufusVS