2

Python パッケージ内にいくつかのモジュールがあります。

# my_package contents
__init__.py
module1.py
module2.py

私の 内で、__init__.pyこれらのモジュールをインポートして、ユーザーがパッケージをインポートするとアクセスできるようにします。

# __init__.py
import module1
import module2

私の質問は、これらの各モジュール内で定義された各関数のドキュメント文字列にプログラムでアクセスするにはどうすればよいですか? 私は他の人がこの形式を使用しているのを見てきまし:

getattr(module, key). __doc__

しかし、私はそれを私のために働かせることができません。何か案は?

編集: もう少し背景を説明します... ドキュメントのコンテンツとして使用する目的で、Python パッケージからコンテンツ (重要なものの 1 つはドキュメント文字列です) を抽出しようとしています。私の上司は、私たちがフィードしようとしているものをすでにセットアップしています。

package.module.function docstring理想的には、結果を出したい

EDIT2:現在機能していないものは次のとおりです。

#my package is named 'tpp'
import tpp

for script in dir(tpp):
    if not "__" in script: #not a builtin...
        docstrings1 = getattr( tpp, script).__doc__
        docstrings2 = " ".join(docstrings1.split())#clean out any newline chars
        print script, docstrings

EDIT3: docstring がどこにあり、どのように整理されているかを把握するには:

import inspect
import tpp

inspect.getdoc(tpp)
#returns None

inspect.getdoc(tpp.module1)
#returns None

inspect.getdoc(tpp.module1.function1)
#'DOCSTRING TEXT FOUND!'

**最終的には、['module1', 'function1', 'DOCSTRING TEXT FOUND!'] のようなリストを取得したいと考えています。

4

2 に答える 2

1

多分あなたはこのようなものが欲しい:

for script in dir(tpp):
    if not "__" in script: #not a builtin...
        docstrings1 = getattr( tpp, script).__doc__
        if docstrings1:  #objects without docstrings return None above, which can't be split.
            docstrings2 = " ".join(docstrings1.split())#clean out any newline chars
            print script, docstrings2

しかし、これがすべてのドキュメントストリングを取得することを保証するものではありません。getattr で取得したアイテムに再帰的にアクセスする必要がある場合があります。

これは再帰的なバージョンです (これはおそらくあなたが望む以上のものを得るでしょう)、循環依存関係で窒息します:

def get_all_doc(obj,indent=''):
    for item in filter(lambda x:not x.startswith('__'),dir(obj)):
        o=getattr(obj,item)
        print "{indent}{item} {doc}".format(indent=indent,
                                            item=item,
                                            doc=o.__doc__)
        get_all_doc(o,indent=indent+'   ')
于 2012-07-25T14:56:24.443 に答える
1

オブジェクトの docstring を取得するには、inspect.getdoc(object)を使用します。オブジェクトが関数かどうかを確認するには、inspect.isfunctionを使用します。

import inspect
for variable in vars(module).values():
    if inspect.isfunction(variable):
        print(inspect.getdoc(variable))

オブジェクトの docstring がない場合、inspect.getdoc は None を返すことに注意してください。そのため、関数の docstring がない場合、コードは None を出力します。

于 2012-07-25T14:41:24.607 に答える