0

私が持っているとしましょうB.py

import A

def F():
    pass

def G():
    pass

if __name__ == '__main__':
    A.f()

そしてそれを実行すると、このようA.fに定義された関数のリストを出力したいと思いますB.py

./B.py
['F', 'G']

問題は、何を書くべきかということA.pyです。

def f():
    ???

このようなことをするので可能だと思われますdoctest

更新ご回答ありがとうございますが、もう1つ制限事項について言及するのを忘れましimport BA.py

理由を説明してみましょう:A.pyMapReduceジョブを実行するためのライブラリです。スクリプトのさまざまな最後でいくつかをインポートAして実行するだけです。A.f次にA.f、定義した関数を分析し、サーバー上で実行します。したがってA.f、呼び出されたすべてのモジュールをインポートすることはできません。

それともできますか?関数はそれがどこから呼び出されたかを知ることができますか?

アップデート

def f():
    module = sys.modules['__main__']
    functions = inspect.getmembers(module, inspect.isfunction)
    ...
4

2 に答える 2

3
def f():
    import B
    import inspect

    functions=inspect.getmembers(B,inspect.isfunction)

http://docs.python.org/library/inspect.html#inspect.getmembers

編集

私は試していませんが、モジュールを引数としてfに渡し、それを使用できるようです。

def f(mod):
    import inspect
    functions=inspect.getmembers(mod,inspect.isfunction)
    return functions

次に、Bから、次のようなことを行うことができます。

import sys
import A
myfuncs=A.f(sys.modules[__name__])
于 2012-05-01T18:38:05.823 に答える
2

これは実際にはdir()関数を使用して行うのは非常に簡単です:

import B

def f():
    print(dir(B))

これは次のようになります。

['A', 'F', 'G', '__builtins__', '__cached__', '__doc__', '__file__', '__name__', '__package__']

ご覧のとおり、これには、通常は表示されないモジュールに存在する非表示の値が含まれます。必要なものについてより具体的にしたい場合はinspectモジュールをチェックしてください。

于 2012-05-01T18:36:50.003 に答える