8

次のコードは例外をスローします。

import inspect

def work():
    my_function_code = """def print_hello():
                              print('Hi!')
                       """
    exec(my_function_code, globals())
    inspect.getsource(print_hello)

上記のコードは例外 IOError をスローします。exec を使用せずに関数を宣言すると (以下のように)、そのソース コードを問題なく取得できます。

import inspect

def work():
    def print_hello():
        print('Hi!')
    inspect.getsource(print_hello)

私がこのようなことをするのには十分な理由があります。

これに対する回避策はありますか? このようなことは可能ですか?そうでない場合、なぜですか?

4

3 に答える 3

6

@jsbuenoの回答を読んだ後、inspect.pyファイルを見たところ、次のことがわかりました。

def findsource(object):
    """Return the entire source file and starting line number for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a list of all the lines
    in the file and the line number indexes a line in that list.  An **IOError
    is raised if the source code cannot be retrieved.**"""
    try:
        file = open(getsourcefile(object))  
    except (TypeError, IOError):
        raise IOError, 'could not get source code'
    lines = file.readlines()               #reads the file
    file.close()

ソース ファイルを開こうとして、そのコンテンツを読み取ろうとすることを明確に示していますexec

于 2012-08-22T12:16:18.047 に答える
4

それは不可能です。実行中のコードのソースにアクセスするために python が行うことは、ソース コード ファイルをディスクにロードすることです。__file__コードのモジュールの属性を調べて、このファイルを見つけます。

「exec」または「compiled」を通じてコード オブジェクトを生成するために使用される文字列は、これらの呼び出しの結果のオブジェクトによって保持されません。

__file__を呼び出す前に、生成されたコードのグローバル ディクショナリに変数を設定し、そのファイルにソース文字列を書き込むと、おそらくコードを確認できますinspect.getsource

于 2012-08-22T11:54:00.723 に答える