2013-01-25 32 views
1

被調用者是否有可能強制其調用者在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 
+0

那麼,我正在研究一個web請求處理程序庫,並有一個子類特定的'login()'方法。在它裏面,我使用基類'self.finish(error = None)'方法。如果沒有錯誤,'finish()'方法在最後被調用,但是如果出現錯誤,那麼它就像這樣調用'self.finish(SomeError()); return'。我只是很好奇,是否可以通過'self.finish(SomeError())'退出'login()'流程。關於可讀性,請參考 –

+0

。在任何情況下,'finish()'方法都應該完成登錄過程,但是如果您錯誤地忽略了'return',流將會繼續,這是不期望的。 –

+1

似乎是使用異常和'with'語句的*上下文管理器*的正確位置。 –

回答

5

從被調用者返回值以便被調用者讀取並從而相應地表現出什麼問題?

代替

caller.return() # ??? 

return False 

def caller(self): 
     print 'in caller before calle' 

     rc = self.callee() 
     if not rc: 
      return 
     print 'in caller after callee' 

和關閉當然你也可以引發異常,並抓住它在被叫方和行爲相應或者乾脆少它通過

重複的mgilson

原因我認爲基於檢查返回值是否

  1. Explicit is better than implicit
  2. 被叫不應該控制的來電行爲。這是一個糟糕的編程習慣。相反,呼叫者應根據被叫方的行爲改變其行爲。
+0

+1,打我吧。這是非常清楚的。你不希望某個函數在沒有看到它的地方返回就會返回 - 提問者的想法會導致難以閱讀代碼。 –

+0

第二點的+1 ... – Arpit

3

在你可以用異常做到這一點的感覺......就籌集到的callee年底一個例外,在caller不處理它...爲什麼你到底要做到這一點?這似乎是可能有一個更好的方式做任何你嘗試......


至於創造被叫的跳躍,這看起來是不可能的。從框架對象Data Model段(重點是我的)

f_lineno是幀的當前行號 - 寫這個從跟蹤函數中跳轉到指定的行(僅針對最底層框架)。調試器可以通過寫入f_lineno來實現Jump命令(又名Set Next Statement)。

+0

hmm。你指的是'拋出'。 ? – Arpit

+0

@Arpit:提高。在Python中,你使用'raise'語句。 –

+0

@Arpit - 不...這是一款發電機專用的東西,我從來沒有完全包裹我的頭(因爲到這裏,我不需要它) – mgilson

相關問題