【问题标题】:error trying to use marshmallow_dataclass尝试使用 marshmallow_dataclass 时出错
【发布时间】:2020-10-24 11:25:21
【问题描述】:

我正在尝试在 pycharm 中的 python (3.9) 测试中使用 marshmallow_dataclass 来尝试它 (marshmallow_dataclass) 并得到错误。 不知道我做错了什么。我已经安装了 marshmallow_dataclass (8.1.0) 到目前为止,我已经成功地使用了 marshmallow (3.8.0) 和 marshmallow_oneofschema (2.1.0) (python 新手,但不会编程)

代码是:

import marshmallow_dataclass
import unittest


class Tests(unittest.TestCase):

    def test_serialize(self):
        print("Hello")

错误是:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2020.2.3\plugins\python-ce\helpers\pycharm\_jb_unittest_runner.py", line 35, in <module>
    sys.exit(main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner, buffer=not JB_DISABLE_BUFFERING))
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\unittest\main.py", line 100, in __init__
    self.parseArgs(argv)
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\unittest\main.py", line 147, in parseArgs
    self.createTests()
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\unittest\main.py", line 158, in createTests
    self.test = self.testLoader.loadTestsFromNames(self.testNames,
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\unittest\loader.py", line 220, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\unittest\loader.py", line 220, in <listcomp>
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\unittest\loader.py", line 154, in loadTestsFromName
    module = __import__(module_name)
  File "C:\xxxx\dev\repos\python\solar\pvoutput-publisher\test\test_serialization\test_delme.py", line 1, in <module>
    import marshmallow_dataclass
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\site-packages\marshmallow_dataclass\__init__.py", line 59, in <module>
    import typing_inspect
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\site-packages\typing_inspect.py", line 25, in <module>
    from typing_extensions import Literal
  File "C:\xxxx\AppData\Local\Programs\Python\Python39\lib\site-packages\typing_extensions.py", line 2084, in <module>
    def TypeAlias(self, parameters):
TypeError: __init__() missing 1 required positional argument: 'doc'```

【问题讨论】:

    标签: python marshmallow


    【解决方案1】:

    我在 python 3.9 alpha 版本 (3.9.0a5) 上遇到了类似的错误,我不确定您的环境中 typing_extensions.py 的版本(可能是 v3.7.4.3 ?)。

    根本原因是:

    • 函数TypeAlias()直接用类_TypeAliasForm装饰,它是python标准库中typing._SpecialForm的子类
    • 在你的python环境中typing._SpecialForm.__init__()有额外的参数doc,因为类_TypeAliasFormTypeAlias()的装饰器,当在装饰过程中实例化_TypeAliasForm时,Python不能提供额外的参数doc

    简而言之,您的typing_extensions.py 与您的python 解释器不同步,详情请参阅源代码:

    看来问题是从python 3.9.0a1到3.9.0a5出现的,所以解决方法是:

    • 将您的 python 升级到最终版本
    • 如果你因为其他原因不能升级python,也许你可以猴子补丁typing._SpecialForm,这里是猴子补丁的例子:
    from typing import _SpecialForm
    origin_getitem = _SpecialForm.__getitem__
    def patch_init(self, name, doc=None):
        if doc is None and callable(name):
            if hasattr(name, '__doc__'):
                doc = name.__doc__
        self._name = name
        self._doc = doc
    def patch_getitem(self, parameters):
        item = None
        if callable(self._name):
            item = self._name(self=self, parameters=parameters)
        else:
            item = origin_getitem(self=self, parameters=parameters)
        return item
    
    if not hasattr(_SpecialForm.__init__, 'patched'):
        _SpecialForm.__init__ = patch_init
        setattr(_SpecialForm.__init__, 'patched', True)
    if not hasattr(_SpecialForm.__getitem__, 'patched'):
        _SpecialForm.__getitem__ = patch_getitem
        setattr(_SpecialForm.__getitem__, 'patched', True)
    
    

    【讨论】:

      猜你喜欢
      • 2017-07-18
      • 2017-02-08
      • 2018-12-02
      • 2020-09-07
      • 2021-09-14
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多