- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试创建一个装饰器类来计算函数被调用的次数,但我收到一条错误消息:
"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 函数的参数吗?任何提示或想法将不胜感激。
顺便说一句,我的代码行“print 'f count =',f.count”似乎是在输出内存地址而不是值,但这是一个完全不同的问题。
最佳答案
__exit__()
方法应该接受有关 with:
block 中出现的异常的信息。见 here .
对您的代码进行以下修改:
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:
block 之一中引发异常,它将被 __exit__()
捕获。
关于python - __enter__ 和 __exit__ 如何在 Python 装饰器类中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417323/
在contextlib.py ,我看到 ExitStack 类正在通过类型对象 (type(cm)) 调用 __enter__() 方法,而不是直接调用给定对象 (cm) )。 我想知道为什么或为什么
def save_list(): f = open('data.txt', 'w') ii = 0 with itemMatrix[ii] as item: f.write(it
刚刚学习 with 语句 especially from this article 问题是,我可以将参数传递给 __enter__ 吗? 我有这样的代码: class clippy_runner:
我没有重新分配 open 关键字,但仍然收到此错误。有什么建议或指导可以解决我的错误吗? with tempfile.mkdtemp() as test_dir: print(tes
将上下文管理器定义为函数,很容易以编程方式从一个上下文管理器中输入一个单独的(或递归的)上下文管理器,如下所示: @contextmanager def enter(times): if ti
这个问题在这里已经有了答案: Object becomes None when using a context manager (3 个答案) 关闭 4 年前。 我在尝试运行代码时收到属性错误。
是否可以保证 __exit__() 方法在 __enter__() 有异常的情况下被调用? >>> class TstContx(object): ... def __enter__(self)
我最近想知道当 __enter__ 引发异常时不隐式调用 __exit__ 的原因是什么?为什么要这样设计?我正在实现服务运行器类以供 'with' 关键字使用,结果 __exit__ 从未被调用。
我是单元测试的新手,我正在尝试找到一种方法来测试 with 关键字是否在我的对象中正常工作。 在这种情况下,我的对象有一个创建临时目录的 __enter__ 方法和应该销毁它的 __exit__ 方法
我运行这个: import numpy as np import sys temp = np.array([[10, 20], [30, 40]]) with np.set_printoptions(
使用 with 语句,我们可以仅使用一层缩进/嵌套来输入许多上下文处理程序: >>> from contextlib import contextmanager >>> @contextmanager
我想在使用 __getattr__ 重定向调用的对象上使用 with。 但是,这似乎不适用于 __enter__ 方法 请考虑以下简化代码来重现错误: class EnterTest(object):
我用谷歌搜索了 calling __enter__ manually但没有运气。所以让我们假设我有 MySQL 连接器类,它使用 __enter__ 和 __exit__ 函数(最初与 with 语句
据我了解,上下文管理器的 __init__() 和 __enter__() 方法只被调用一次,一个接一个,没有任何机会其他要在两者之间执行的代码。将它们分成两种方法的目的是什么,我应该在每种方法中放入
关注 this related question ,虽然总是有一些库以独特的方式使用语言特性的例子,但我想知道是否返回 self 以外的值在 __enter__方法应该被认为是一种反模式。 这在我看来
有没有一种方法可以在上下文管理器的 __enter__ 方法中捕获异常,而无需将整个 with block 包装在 try 中? class TstContx(object): def __e
我问了this昨天的问题。但现在我意识到这是一个错误的问题。 __enter__ 函数通常包含 try block 吗? 最佳答案 如果您准备好从异常中正常恢复,他们可以,但是通常您会希望允许异常向上
问题几乎说明了一切。 我想以这种方式查看代码: >>>f = open("x.txt") >>>print contents of f.__enter__() #>> f = open("x.txt"
我有一个 python 包,我想在 Matlab 中使用它的类和方法。我知道这可以从 Matlab 2014b 开始直接完成。我的意思是您所要做的就是在语句的开头添加 py. 。然而,到目前为止一切顺
假设: class A(object): def __init__(self): self.cnt = 0 def __enter__(self): self.cnt += 1
我是一名优秀的程序员,十分优秀!