允许调用函数在 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
语句 returns 会立即向调用者发送某些内容,因此这意味着必须有 "hook" 或 "pipe"子函数可访问,它被用作与 parent.So 进行信息交换的媒介,最初引起我兴趣的问题是:
这个管道是只发送的,不能向后发送信息吗?
我无法回答这个问题,因为 return
声明在我搜索的网站中只作了简要解释。除此之外,据我所知,inspect
模块将多个帧保存在堆栈中并在后台不断运行。对我来说,这就像我试图用迷你枪杀死一只苍蝇。我只需要调用函数的名称,而不是 10 帧之前的函数。如果没有办法做到这一点,我认为这是Python必须具备的功能。我的问题是:
在 Python 中获取调用者属性的 pythonic 编程方式是什么,具有普遍支持?对不起,如果我的问题无知,我愿意接受任何更正和 "mind-openings"。谢谢大家的回答。
我有几个功能可能与您的问题有关
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
我想创建一个函数,每当调用者获取错误实例的参数时调用该函数,它将打印调用者的 __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
语句 returns 会立即向调用者发送某些内容,因此这意味着必须有 "hook" 或 "pipe"子函数可访问,它被用作与 parent.So 进行信息交换的媒介,最初引起我兴趣的问题是:
这个管道是只发送的,不能向后发送信息吗?
我无法回答这个问题,因为 return
声明在我搜索的网站中只作了简要解释。除此之外,据我所知,inspect
模块将多个帧保存在堆栈中并在后台不断运行。对我来说,这就像我试图用迷你枪杀死一只苍蝇。我只需要调用函数的名称,而不是 10 帧之前的函数。如果没有办法做到这一点,我认为这是Python必须具备的功能。我的问题是:
在 Python 中获取调用者属性的 pythonic 编程方式是什么,具有普遍支持?对不起,如果我的问题无知,我愿意接受任何更正和 "mind-openings"。谢谢大家的回答。
我有几个功能可能与您的问题有关
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