繁体   English   中英

允许调用函数在Python中获取调用者的属性

[英]Allow calling function to get caller's attribute in Python

我想创建一个在调用者获取错误实例参数时将被调用的函数,该函数将打印调用者的__doc__属性并退出。 该函数如下:

def checktype(objects,instances):
    if not all([isinstance(obj,instance) for
                obj,instance in zip(objects,instances)]):
      print 'Type Error'
      #Get __doc__ from caller
      print __doc__
      exit()

我陷入了必须获得__doc__属性的步骤。 我知道inspect模块可以通过以下方式做到这一点:

name=inspect.stack()[1][3]
possibles=globals().copy()
__doc__= possibles.get(name).__doc__

(您可以建议另一个与每个Python版本(包括3.5版本)兼容的版本)

但我认为必须有另一种方式。 我对此表示怀疑的原因是,内置的return语句会立即将某些内容返回给调用方,因此这意味着必须有一个可以由child函数访问的“ hook”或“ pipe”,它被用作与父母进行信息交流的媒介。因此,引起我兴趣的第一个问题是:

该管道是仅发送的,没有信息可以向后发送吗?

我无法回答这个问题,因为return语句仅在我搜索的站点中得到了简要说明。 除此之外,据我所知, inspect模块将多个帧保存在堆栈中,并在后台不断运行。 对我来说,这就像我试图用迷你枪杀死一只苍蝇。 我只需要调用者函数的名称,而不是10帧之前的函数。 在我看来,如果没有任何方法可以实现,那么这就是Python必须具备的功能。 我的问题是:

在通用支持下,用Python编程的方式在Python中获取调用者的属性是什么? 如果我的问题中有无知,请原谅。我愿意接受任何更正和“开诚布公”。 谢谢大家的答案。

我有一些功能可能与您的问题有关

import sys

def position(level = 0):
    """return a tuple (code, lasti, lineno) where this function is called

    If level > 0, go back up to that level in the calling stack.
    """
    frame = sys._getframe(level + 1)
    try:
        return (frame.f_code, frame.f_lasti, frame.f_lineno)
    finally:
        del frame

def line(level = 0):
    """return a tuple (lineno, filename, funcname) where this function is called

    If level > 0, go back up to that level in the calling stack.

    The filename is the name in python's co_filename member
    of code objects.
    """
    code, lasti, lineno = position(level=level+1)
    return (lineno, code.co_filename, code.co_name)

def _globals(level = 0):
    """return the globals() where this function is called

    If level > 0, go back up to that level in the calling stack.

    """
    frame = sys._getframe(level + 1)
    try:
        return frame.f_globals
    finally:
        del frame

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM