Разрешить вызывающей функции получить атрибут вызывающего в 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 с универсальной поддержкой? Извините, если в моем вопросе есть невежество, я открыт для любых исправлений и "открытий ума". Спасибо всем за ваши ответы.
1 ответ
У меня есть несколько функций, которые могут быть связаны с вашей проблемой
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