ContextDecorator 的后继者不起作用:'generator' 对象没有属性 'add'

达里亚·利特温丘克

我在继承ContextDecorator类时遇到问题我不明白为什么该方法session_manager()有效:

@contextmanager
def session_manager():
    session = Session()
    yield session
    try:
    session.commit()
except Exception as e:
    session.rollback()
    raise e
finally:
    session.close()

但是与ContextDecorator后继类完全相同的代码给出了错误:

class SessionManager(ContextDecorator):
    def __init__(self):
        self.session = Session()

    def __enter__(self):
        try:
            yield self.session
            self.session.commit()
        except Exception as e:
            self.session.rollback()
            raise e

    def __exit__(self, *exc):
        self.session.close()

例外:

AttributeError: 'generator' object has no attribute 'add'

文档和教程没有复杂的示例(仅使用“打印”语句),并且效果很好:https : //docs.python.org/3/library/contextlib.html

我不明白为什么方法session_manager()有效,尽管它返回一个生成器:

yield session

这里我写了一些小而简单的代码:https : //gist.github.com/tranebaer/46f94263030dd8f7c1bfcf72d0e37610

伊利亚·埃维莱拉

__enter__方法不应该是生成器,除非您想在运行时上下文中这样处理返回值。当进入由 with- 语句控制的块时调用它,并且它的返回值绑定到as子句中指定的目标(如果有)。所以属性错误是在add()块内的生成器上调用方法的结果,当你的意思是它是Session对象时。可能的清理和异常处理应该在__exit__方法中进行:

from contextlib import closing, ContextDecorator, ExitStack

class SessionManager(ContextDecorator):

    def __init__(self, session_cls=Session):
        self.session = session_cls()

    def __enter__(self):
        return self.session

    def __exit__(self, type, value, tb):
        with closing(self.session), ExitStack() as stack:
            stack.callback(self.session.rollback)
            if not value:
                self.session.commit()
                # If commit raises an exception, then rollback is left
                # in the exit stack.
                stack.pop_all()

请注意,您不需要ContextDecorator为了创建上下文管理器而继承仅仅实现__enter____exit__就够了。实际上在这种情况下它有点毫无意义,因为用 装饰的函数SessionManager 无法访问Session对象

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java ArrayList对象的add()方法不起作用

来自分类Dev

Rasa nlu模型不起作用。AttributeError:'str'对象没有属性'load'

来自分类Dev

'tuple' 对象没有属性 'sort.......Sort 函数在 jupyter notebook 中不起作用?

来自分类Dev

类型“ generator”的对象没有len()

来自分类Dev

Tkinter对象没有属性,有时起作用,有时没有?

来自分类Dev

AttributeError:“模块”对象没有属性“ add_arg_scope”

来自分类Dev

“工作簿”对象没有属性“ add_chart”

来自分类Dev

“用户”对象没有属性“ add_roles”

来自分类Dev

xlsxwriter AttributeError:'str'对象没有属性'add_worksheet'

来自分类Dev

python错误“ dict”对象没有属性:“ add”

来自分类Dev

Kivy:AttributeError:'NoneType' 对象没有属性 'add_widget'

来自分类Dev

“请求”对象没有属性“add_data”

来自分类Dev

Python-3.2协程:AttributeError:'generator'对象没有属性'next'

来自分类Dev

Biopython翻译错误:TypeError:'generator'对象没有属性'__getitem__'

来自分类Dev

用户属性,没有 concord 的随机对象 .. 为什么不起作用?为什么没有得到 21 个对象?

来自分类Dev

Python-观察者模式-对象没有属性

来自分类Dev

Python-观察者模式-对象没有属性

来自分类Dev

使用xlsxwriter中的Workbook对象时,Workbook对象没有属性'add_sheet'

来自分类Dev

moto sns客户端无法调用create_topic AttributeError:'generator'对象没有属性'create_topic'

来自分类Dev

ViewController观察对象属性不起作用

来自分类Dev

ViewController观察对象属性不起作用

来自分类Dev

按属性排序对象不起作用

来自分类Dev

django-1.8:“ XXXView”对象没有属性“ add_error”

来自分类Dev

异常值:“ NoneType”对象没有属性“ add”,类别名称未显示Django

来自分类Dev

discord.py在使用add_roles时等待“ AttributeError:'list'对象没有属性'id'”

来自分类Dev

discord.py在使用add_roles时等待“ AttributeError:'list'对象没有属性'id'”

来自分类Dev

我的代码失败,错误为“ AttributeError:'NoneType'对象没有属性'add'”

来自分类Dev

classList.add不起作用

来自分类Dev

为什么ArrayList <>。add()不起作用?

Related 相关文章

  1. 1

    Java ArrayList对象的add()方法不起作用

  2. 2

    Rasa nlu模型不起作用。AttributeError:'str'对象没有属性'load'

  3. 3

    'tuple' 对象没有属性 'sort.......Sort 函数在 jupyter notebook 中不起作用?

  4. 4

    类型“ generator”的对象没有len()

  5. 5

    Tkinter对象没有属性,有时起作用,有时没有?

  6. 6

    AttributeError:“模块”对象没有属性“ add_arg_scope”

  7. 7

    “工作簿”对象没有属性“ add_chart”

  8. 8

    “用户”对象没有属性“ add_roles”

  9. 9

    xlsxwriter AttributeError:'str'对象没有属性'add_worksheet'

  10. 10

    python错误“ dict”对象没有属性:“ add”

  11. 11

    Kivy:AttributeError:'NoneType' 对象没有属性 'add_widget'

  12. 12

    “请求”对象没有属性“add_data”

  13. 13

    Python-3.2协程:AttributeError:'generator'对象没有属性'next'

  14. 14

    Biopython翻译错误:TypeError:'generator'对象没有属性'__getitem__'

  15. 15

    用户属性,没有 concord 的随机对象 .. 为什么不起作用?为什么没有得到 21 个对象?

  16. 16

    Python-观察者模式-对象没有属性

  17. 17

    Python-观察者模式-对象没有属性

  18. 18

    使用xlsxwriter中的Workbook对象时,Workbook对象没有属性'add_sheet'

  19. 19

    moto sns客户端无法调用create_topic AttributeError:'generator'对象没有属性'create_topic'

  20. 20

    ViewController观察对象属性不起作用

  21. 21

    ViewController观察对象属性不起作用

  22. 22

    按属性排序对象不起作用

  23. 23

    django-1.8:“ XXXView”对象没有属性“ add_error”

  24. 24

    异常值:“ NoneType”对象没有属性“ add”,类别名称未显示Django

  25. 25

    discord.py在使用add_roles时等待“ AttributeError:'list'对象没有属性'id'”

  26. 26

    discord.py在使用add_roles时等待“ AttributeError:'list'对象没有属性'id'”

  27. 27

    我的代码失败,错误为“ AttributeError:'NoneType'对象没有属性'add'”

  28. 28

    classList.add不起作用

  29. 29

    为什么ArrayList <>。add()不起作用?

热门标签

归档