被調用者是否有可能強制其調用者在python中返回? 如果是這樣,這是一個好方法嗎?它不違反顯式比隱式更好。句子的Zen of Python?被調用者是否可以強制其調用者在python中返回?
例子:
import inspect
class C(object):
def callee(self):
print 'in callee'
caller_name = inspect.stack()[1][3]
caller = getattr(self, caller_name)
# force caller to return
# so that "in caller after callee" gets never printed
caller.return() # ???
def caller(self):
print 'in caller before calle'
self.callee()
print 'in caller after callee'
c = C()
c.caller()
print 'resume'
輸出:
in caller before callee
in callee
resume
最後,感謝@Andrew賈菲對上下文管理建議我用一個簡單的裝飾解決它。
# In my real code this is not a global variable
REPORT_ERRORS = True
def error_decorator(func):
"""
Returns Event instance with result of the
decorated function, or caught exception.
Or reraises that exception.
"""
def wrap():
error = None
user = None
try:
user = func()
except Exception as e:
error = e
finally:
if REPORT_ERRORS:
return Event(user, error)
else:
raise error
return wrap
@error_decorator
def login():
response = fetch_some_service()
if response.errors:
# flow ends here
raise BadResponseError
user = parse_response(response)
return user
那麼,我正在研究一個web請求處理程序庫,並有一個子類特定的'login()'方法。在它裏面,我使用基類'self.finish(error = None)'方法。如果沒有錯誤,'finish()'方法在最後被調用,但是如果出現錯誤,那麼它就像這樣調用'self.finish(SomeError()); return'。我只是很好奇,是否可以通過'self.finish(SomeError())'退出'login()'流程。關於可讀性,請參考 –
。在任何情況下,'finish()'方法都應該完成登錄過程,但是如果您錯誤地忽略了'return',流將會繼續,這是不期望的。 –
似乎是使用異常和'with'語句的*上下文管理器*的正確位置。 –