允许调用函数获取调用者';Python中的s属性

允许调用函数获取调用者';Python中的s属性,python,function,attributes,callermembername,Python,Function,Attributes,Callermembername,我想创建一个函数,每当调用方获得错误实例的参数时调用该函数,该函数将打印调用方的\uuu doc\uu属性并退出。功能如下: def checktype(objects,instances): if not all([isinstance(obj,instance) for obj,instance in zip(objects,instances)]): print 'Type Error' #Get __doc__ from c

我想创建一个函数,每当调用方获得错误实例的参数时调用该函数,该函数将打印调用方的
\uuu doc\uu
属性并退出。功能如下:

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()
name=inspect.stack()[1][3]
possibles=globals().copy()
__doc__= possibles.get(name).__doc__
我被困在步骤中,在那里我必须获得
\uu doc\uu
属性。我知道,
inspect
模块可以通过如下方式进行检查:

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()
name=inspect.stack()[1][3]
possibles=globals().copy()
__doc__= possibles.get(name).__doc__
(您可以建议另一个与所有Python版本(包括3.5版)兼容的版本)

但我想一定还有别的办法。我对此持怀疑态度的原因是,内置的
return
语句立即向调用者返回了一些东西,这意味着子函数必须有一个“钩子”或“管道”,它被用作与父函数交换信息的媒介。因此,引发我兴趣的最初问题是:

此管道是否仅发送,而不能向后发送任何信息

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


在Python中,在通用支持下,获取调用方属性的pythonic编程方式是什么?请原谅,如果我的问题是无知的,我愿意接受任何纠正和“思想开放”。谢谢大家的回答。

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

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

我认为一个decorator将适合于此。@polku我想知道如何在decorator中传递函数参数。如果我有一个信号处理程序集,那么包装器是个不错的主意,但我认为这可能只适用于Linux发行版。IDK您对decorator有多熟悉,但不向它传递函数参数。我的理解是,您需要一种可重复使用的类型检查机制,用于不同的函数,这就是我所使用的(以及一个自定义异常,而不是打印和退出),但可能我弄错了。谢谢您的回答。据我所知,您建议使用
sys.\u getframe(1).f\u code.co\u name
。这将获取函数的名称,但无法获取任何其他属性。这是个好主意。此Windows兼容吗?请尝试
\u globals(1)[line(1)[2].\u doc\u
。所有这些都与操作系统无关。好吧,这符合要求,非常简洁,因为我使用了一个内置模块:
f=sys.\u getframe(1);打印f.f_全局文件[f.f_代码.co_名称]。u文档u
请参见。使用try…最后我找到了一个更简单的方法:
getattr(f.f\u locals['self']。\uuuuu class\uuuu,f.f\u code.co\u name)。\uuuu文档