Возврат функции, вызвавшей эту функцию - PullRequest
1 голос
/ 25 июня 2011

Итак, я пишу код Python (v2.7) с функцией для отображения сообщения об ошибке.Но есть несколько других функций, которые полагаются на эту оригинальную функцию проверки ошибок.

Теперь, когда вызывается эта функция проверки ошибок, и если есть ошибка, я хочу отобразить ошибку, ивызовите функцию, вызвавшую эту функцию ошибки.

Пример: если error() вызван function1() и ошибки нет, функция error() не сделает ничего важного.Теперь function1() звонит function2().Когда function2() вызывает функцию error(), она обнаруживает ошибку, отображает сообщение об ошибке и снова вызывает function2().Это то, что я хочу сделать, но я не знаю, как вернуть вызывающую функцию обратно.

Ответы [ 2 ]

4 голосов
/ 25 июня 2011

Неявное обращение к вызывающей функции обязательно приведет к бесконечным циклам, ошибкам (если только вы не убедитесь, что все методы, вызывающие ошибку, являются идемпотентными, даже если преждевременно прерваны), путанице и, в любом случае, совершенно непифоничным.То, что вы ищете, это просто обычная обработка ошибок:

def f2():
   try:
       1/0 # complicated code, potentially raising an error
   except ZeroDivisionError: # Or BaseException, if you gotta catch them all
       error()
       # clean up, restore a consistent state
   # go on, no matter whether the error occurred or did not

Если просто повторная попытка помогает, вы просто записываете:

 def sometimes_fails():
     1 / random.randint(0,1)

 def f():
    while True:
        try:
            sometimes_fails()
         except ZeroDivisionError:
            continue # try again
         break # abort

Использование общего имени, например error дляочень необычное, чрезвычайно сложное (идемпотентное) и поэтому подверженное ошибкам поведение не очень хорошая идея.

Этот ответ вам преподнес On Error Resume Next.

3 голосов
/ 25 июня 2011

phinag правильно упомянул, что это плохая идея. Но если вам все еще это нужно, модуль inspect может помочь:

import inspect

def foo():
    print globals().get(inspect.stack()[1][3]

def baz():
    foo()

baz() # prints <function baz at 0x0...>
...