在python中定位(文件/行)构造函数的调用

2024-03-28 11:44:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个事件系统:各种代码将把事件发布到一个中心位置,在那里它们将被分发给所有侦听器。这种方法的主要问题是:当事件处理过程中发生异常时,我不能再告诉谁发布了事件。在

所以我的问题是:在Python2.5中,有没有一种有效的方法来找出谁调用了构造函数并记住了这一点?在

更多信息:简单的方法是使用traceback模块在构造函数中获取堆栈的副本并记住这一点。唉,我很少需要这些信息,所以我想知道是否有一种方法可以缓存这些信息,或者我是否可以只记住最上面的堆栈帧,然后在我真正需要这些数据的罕见情况下重新工作。在


Tags: 模块数据方法代码信息堆栈系统副本
3条回答
import sys
def get_caller(ext=False):
    """ Get the caller of the caller of this function. If the optional ext parameter is given, returns the line's text as well. """
    f=sys._getframe(2)
    s=(f.f_code.co_filename, f.f_lineno)
    del f
    if ext:
        import linecache
        s=(s[0], s[1], linecache.getline(s[0], s[1]))

    return s

def post_event(e):
    caller=get_caller(True)
    print "Event %r posted from %r"%(e, caller)

## Testing the functions.

def q():
    post_event("baz")

post_event("foo")
print "Hello!"
q()

结果

^{pr2}$

我认为最简单的方法是向相关事件添加一个ID字段,并在发布事件时让每个事件源(根据“event source”的适当定义)提供一个唯一的标识符。你确实会得到一些额外的开销,但可能不足以产生问题,我想你会找到其他方法来了解事件的来源会有所帮助。在

您可以简单地存储对调用方的frame对象的引用,但这可能不是一个好主意。这会使帧保持活动状态,并保存对所有使用的本地变量的引用,因此,如果它们碰巧使用了大量内存,则可能会影响性能;如果它们(不正确地)依赖终结来销毁超出范围的锁和文件句柄等资源,则可能会产生更糟糕的影响。在

这意味着您需要保留stacktrace的字符串表示形式,这对于您的目的来说并不理想(需要实际进行一些处理才能获得它,即使很少需要)。不幸的是,虽然您可以考虑禁用它,直到您设置了一些配置选项,但似乎没有什么办法可以绕过它。这样,对于常见情况,您可以获得更好的性能,但在尝试诊断故障时仍然可以启用该设置。在

如果仅调用函数(或少数父调用方)就足以区分路由(即,通过func1()调用时,跟踪始终相同,并且没有func2->;func1()与func3()->;func1()进行区分),则可以根据调用帧的文件名和行号(或最后一个)维护哈希两个主叫帧等)。但是,这可能与您的情况不匹配,如果不匹配,您将得到虚假的堆栈跟踪。在

请注意,如果您确实需要调用方的帧,使用^{}可能是获得它的更好方法。在

相关问题 更多 >