我怎么知道在Python中执行函数的位置?

时间:2013-08-28 13:45:04

标签: python function introspection

让我们想象一下,我有一个模块foo.py,声明了一个函数foofunc

def foofunc():
    # smart things
    return

还有两个不同的模块 - bar.pyspam.py,其中存在直接执行foo模块函数的代码。

# `bar` module. All rights reserved.

from foo import foofunc


def run_foofunc():
     return foofunc()

另一个模块中的相同内容:

# `spam` module. All rights reserved.

from foo import foofunc


def run_foofunc():
    return foofunc()

我需要知道在不知道可能的地方的情况下执行功能的位置。类似的东西:

def foofunc():
    print inspect.executedfrom()

将在标准输出中执行类似的操作

<pack.bar.run_foofunc>

在现实世界中它有类似之处吗?

4 个答案:

答案 0 :(得分:2)

冒着不回答实际问题的风险,你写道,你需要它进行研究和调试。

我认为traceback模块对此非常有用。

import traceback
traceback.print_stack()

另请查看pdb,它允许您在运行时以交互方式单步执行代码。

答案 1 :(得分:2)

<强> test.py:

import inspect    

def foofunc():
    frame, filename, line_number, function_name, lines, index = inspect.getouterframes(
        inspect.currentframe())[1]

    print(filename, line_number, function_name)
    return

<强> foo.py:

import test
def run_foofunc():
    test.foofunc()

run_foofunc()

产量

('/tmp/foo.py', 3, 'run_foofunc')

答案 2 :(得分:0)

以下是executed_from

的可能实现
import inspect

def executed_from():
    f = inspect.currentframe().f_back.f_back
    return "%s.%s" % (inspect.getmodule(f).__name__, f.f_code.co_name)

答案 3 :(得分:0)

在等待你的答案期间,我找到了自己的答案。通过在调试函数中引发异常并逐层进行回溯,可以解决此问题。这种方法通常很糟糕,因为它会停止执行,但在我的特定情况下并不坏。此外,它非常pythonic,易于清洁。