TypeError:无法将此 __setattr__ 应用于 DefaultMeta 对象 - Flask 应用程序 - python

问题描述 投票:0回答:6

最初的问题,我正在 Flask 应用程序框架上进行开发,我正在尝试蓝图模板,它更新了我的 python 版本,我认为是 3.8.4,并且出现了这个新错误。我使用的是 python 3.8.3

flask run

输出了一个复杂的错误,一个Python类型的Error。

     File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1264.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1264.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 87, in _run_code     
    exec(code, run_globals)
  File "D:\Openvessel\vessel-app\vessel_env\Scripts\flask.exe\__main__.py", line 9, in <module>
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 966, in main
    cli.main(prog_name="python -m flask" if as_module else None)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 586, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 782, in main
    rv = self.invoke(ctx)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\decorators.py", line 73, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\click\core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 848, in run_command
    app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 305, in __init__
    self._load_unlocked()
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 330, in _load_unlocked
    self._app = rv = self.loader()
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 388, in load_app
    app = locate_app(self, import_name, name)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask\cli.py", line 240, in locate_app
    __import__(module_name)
  File "D:\Openvessel\vessel-app\Back-end\app.py", line 1, in <module>
    from vessel_app import create_app
  File "D:\Openvessel\vessel-app\Back-end\vessel_app\__init__.py", line 21, in <module>
    db = SQLAlchemy()
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask_sqlalchemy\__init__.py", line 716, in __init__
    self.Model = self.make_declarative_base(model_class, metadata)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\flask_sqlalchemy\__init__.py", line 798, in make_declarative_base
    model.query_class = self.Query
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\sqlalchemy\ext\declarative\api.py", line 79, in __setattr__
    _add_attribute(cls, key, value)
  File "d:\openvessel\vessel-app\vessel_env\lib\site-packages\sqlalchemy\ext\declarative\base.py", line 802, in _add_attribute
    type.__setattr__(cls, key, value)
TypeError: can't apply this __setattr__ to DefaultMeta object

我最后的猜测是它或它的python版本3.8.4 slim有这个错误。

File "D:\Openvessel\vessel-app\Back-end\vessel_app\__init__.py", line 21, in <module>
db = SQLAlchemy()
python-3.x flask flask-sqlalchemy
6个回答
3
投票

这看起来像是Python语言中引入的一个问题。

要解决此问题:

您可以恢复正在构建的 python 版本,或者如果您使用的是 docker,请使用 python:3.8.3-slim 或等效图像临时修复 python 图像。您也可以等到修复完成。

您可以在此处查看相关的拉取请求:https://github.com/python/cpython/pull/21473

这里介绍:https://bugs.python.org/issue39960

在这里修补错误:https://bugs.python.org/issue41295

不相关的包中的另一个问题是相同的错误:flask_sqlalchemy: error with `__setattr__` to `DefaultMeta`

Git 实验室 CI 使用 SqlAlchemy 运行鼻子测试。错误:失败:TypeError(无法将此 __setattr__ 应用于 DefaultMeta 对象)

编辑:引入修复程序的新版本已发布。查看 python:3.8.5 + 的任何图像。


2
投票

自从升级到3.8.4后,我也偶然发现了这个问题,这确实是这个版本引入的错误。
在之前的答案中,降级是最好的选择,但这个问题已经在 7 月 20 日发布的 python 3.8.5 中得到解决,如changelog中所述:

bpo-41295:解决 CPython 3.8.4 中的回归问题,其中如果基本类型中涉及内置/扩展类型,则在多继承设置中定义“setattr”并调用层次结构链可能会失败。

所以现在您可以升级到新的稳定版本而不是降级。


1
投票

是的,它似乎在较新的 python 版本上崩溃了。我将 python 版本降级到 3.8.2,它的效果非常好。


1
投票

我最近遇到了同样的问题,并使用 pip install git+git://github.com/pallets/flask-sqlalchemy.git

修复了它

有关此答案的完整详细信息可以从 kam193 的评论

获得

0
投票

我在 python 3.8.4 和 Flask-SQLAlchemy 2.4.1 中也遇到了这个问题。我使用 Tysonic 的答案将 Flask-SQLAlchemy 更新到 v3,但这只是在启动 Flask 时引入了新错误。

我能够通过使用 pip 卸载 Flask-SQLAlchemy 并再次安装来解决,这给我留下了 2.4.4 并且一切正常。我的版本:python 3.8.4、Flask-SQLAlchemy 2.4.4、Flask 1.1.2、SQLAlchemy 1.3.17。


0
投票

3.11.4版本有错误!在 SPyder 中运行。

[打字扩展的自动重新加载失败:回溯(最近一次调用最后一次): 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 273 行,检查 superreload(m, 重新加载, self.old_objects) 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 496 行,在 superreload 中 update_generic(旧的_obj,新的_obj) 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 393 行,位于 update_generic 更新(a,b) 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 361 行,在 update_class 中 update_instances(旧的,新的) 文件“C:\Users\jaske naconda3\Lib\site-packages\IPython xtensions utoreload.py”,第 319 行,位于 update_instances 中 对象。setattr(参考,“class”,新) TypeError:无法将此 setattr 应用于 _TypedDictMeta 对象 ]

© www.soinside.com 2019 - 2024. All rights reserved.