允许调用函数在 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语句以直接的方式将某些内容返回给呼叫者,因此这意味着必须有一个"钩子"或"管道",可以通过子函数访问,这被用作用作与父母进行信息交流的媒介。因此,引发我兴趣的最初问题是:

该管道是发送的,并且无法向后发送信息吗?

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

在普遍支持的情况下,在Python中获得呼叫者属性的Pythonic-Programmatic方法是什么?请问,如果我的问题中有无知,我对任何更正和"思维方式"开放。谢谢大家的回答。

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

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

相关内容

  • 没有找到相关文章

最新更新