在Python装饰器类中__enter__和__exit__是如何工作的



我试图创建一个decorator类,计算调用函数的次数,但我得到一个错误消息说:

    "TypeError: __exit__() takes exactly 1 argument (4 given)"

我真的不知道我是怎么给它四个参数的。我的代码是这样的:

class fcount2(object):
    __instances = {}
    def __init__(self, f):
        self.__f = f
        self.__numcalls = 0
        fcount2.__instances[f] = self
    def __call__(self, *args, **kwargs):
        self.__numcalls += 1
        return self.__f(*args, **kwargs)
    def __enter__(self):
        return self
    def __exit__(self):
        return self
    @staticmethod
    def count(f):
        return fcount2.__instances[self.__f].__numcalls

@fcount2
def f(n):
    return n+2
for n in range(5):
    print f(n)   
print 'f count =',f.count
def foo(n):
    return n*n
with fcount2(foo) as g:
    print g(1)
    print g(2)
print 'g count =',g.count
print 'f count =',f.count
with fcount2(f) as g:
    print g(1)
    print g(2)
print 'g count =',g.count
print 'f count =',f.count
with f:
    print f(1)
    print g(2)
print 'g count =',g.count
print 'f count =',f.count

是否有其他一些参数我应该(或不应该)传递到def exit函数?如有任何建议或意见,我将不胜感激。

作为题外话,我的那行代码说"打印'f count =',f。Count"似乎输出的是内存地址而不是值,但这是一个完全不同的问题。

__exit__()方法应该接受有关with:块中出现的异常的信息。看到这里。

下面的代码修改可以工作:

def __exit__(self, exc_type, exc_value, tb):
    if exc_type is not None:
        traceback.print_exception(exc_type, exc_value, tb)
        # return False # uncomment to pass exception through
    return True

然后您可以尝试在with:块之一中引发异常,它将在__exit__()中被捕获。

您得到该错误的原因是因为__exit__()self一起接受3个参数。这些都是:

  1. exception_type
  2. exception_value
  3. <
  4. 回溯/gh>

你可以用两种方式定义__exit__()方法:

def __exit__(self, exception_type, exception_value, traceback):

def __exit__(self, *args, **kwargs):

with语句支持由使用__enter__() &实现的上下文管理器定义的运行时上下文的概念。__exit__()方法对。详细信息请访问此链接。

__enter__()方法将进入运行时上下文并返回此对象或与运行时上下文相关的另一个对象。

__exit__()方法将退出运行时上下文并返回一个布尔标志,指示是否应该抑制发生的任何异常。这些参数的值包含有关所抛出异常的信息。如果值为None则表示没有抛出异常

相关内容

  • 没有找到相关文章

最新更新