Skip to main content
 首页 » 编程设计

python之被调用者是否有可能强制其调用者在 python 中返回

2025年05月04日14qq78292959

被调用者是否可以强制其调用者在 python 中返回? 如果是这样,这是一个好方法吗?这不违反Zen of 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 Jaffe 关于上下文管理器的建议,我用一个简单的装饰器解决了这个问题。

# 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 

请您参考如下方法:

从被调用方返回一个值以供调用方读取并据此执行相应操作有什么问题?

代替

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. 显式优于隐式
  2. 被调用者不应控制调用者行为。这是一种糟糕的编程习惯。相反,调用者应该根据被调用者的行为改变其行为。