Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

str | None fails #226

Closed
hydrargyrum opened this issue Jan 2, 2023 · 5 comments
Closed

str | None fails #226

hydrargyrum opened this issue Jan 2, 2023 · 5 comments
Labels
bug Something isn't working

Comments

@hydrargyrum
Copy link

With these versions:

marshmallow==3.19.0
marshmallow-dataclass==8.5.10
marshmallow-enum==1.5.1
marshmallow-oneofschema==2.1.0

The following snippet breaks:

from typing import Optional, Union

from marshmallow_dataclass import dataclass


@dataclass
class WithOptional:
    id: Optional[str] = None


@dataclass
class WithUnion:
    id: Union[str, None]


@dataclass
class WithOr:
    id: str | None = None



print(WithOptional.Schema().load({}))
print(WithUnion.Schema().load({}))
print(WithOr.Schema().load({}))

with error:

WithOptional(id=None)
WithUnion(id=None)
Traceback (most recent call last):
  File "/home/.../marshbug.py", line 24, in <module>
    print(WithOr.Schema().load({}))
  File "/home/.../venv/lib/python3.10/site-packages/marshmallow_dataclass/lazy_class_attribute.py", line 33, in __get__
    setattr(cls, self.name, self.func())
  File "/home/.../venv/lib/python3.10/site-packages/marshmallow_dataclass/__init__.py", line 357, in class_schema
    return _internal_class_schema(clazz, base_schema, clazz_frame)
  File "/home/x/dev/core/venv/lib/python3.10/site-packages/marshmallow_dataclass/__init__.py", line 403, in _internal_class_schema
    attributes.update(
  File "/home/.../venv/lib/python3.10/site-packages/marshmallow_dataclass/__init__.py", line 406, in <genexpr>
    field_for_schema(
  File "/home/.../venv/lib/python3.10/site-packages/marshmallow_dataclass/__init__.py", line 734, in field_for_schema
    or _internal_class_schema(typ, base_schema, typ_frame)
  File "/home/.../venv/lib/python3.10/site-packages/marshmallow_dataclass/__init__.py", line 368, in _internal_class_schema
    _RECURSION_GUARD.seen_classes[clazz] = clazz.__name__
AttributeError: 'types.UnionType' object has no attribute '__name__'. Did you mean: '__ne__'?
@otonnesen
Copy link
Contributor

I was unable to reproduce on python 3.10.8 with marshmallow-dataclass==8.5.10. Reverting to 8.5.9 produces the same output that you pasted above though. For reference:

(venv) $ cat requirements.txt
marshmallow==3.19.0
marshmallow-dataclass==8.5.10
marshmallow-enum==1.5.1
marshmallow-oneofschema==2.1.0

(venv) $ pip install -r requirements.txt
Requirement already satisfied: marshmallow==3.19.0 in ./venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (3.19.0)
...

(venv) $ pip freeze
marshmallow==3.19.0
marshmallow-dataclass==8.5.10
marshmallow-enum==1.5.1
marshmallow-oneofschema==2.1.0
mypy-extensions==0.4.3
packaging==22.0
typing-inspect==0.8.0
typing_extensions==4.4.0

(venv) $ python -V
Python 3.10.8

(venv) $ python test.py
WithOptional(id=None)
WithUnion(id=None)
WithOr(id=None)

@dairiki
Copy link
Collaborator

dairiki commented Jan 3, 2023

I was unable to reproduce on python 3.10.8 with marshmallow-dataclass==8.5.10. Reverting to 8.5.9 produces the same output that you pasted above though.

PR #219, included as of release 8.5.10, should (at least, in theory) support the str | None notation.
(There is even a regression test for it.)

@hydrargyrum
Copy link
Author

Ok the issue seems when this version is pinned: typing-inspect==0.7.1

@otonnesen
Copy link
Contributor

I see. I believe that's sort of expected since support for UnionType was only added here in typing-inspect v0.8.0.

It seems that marshmallow-dataclass only specifies typing-inspect>=0.7.1 in its setup.py, so I think this actually is a bug after all.

dairiki added a commit that referenced this issue Jan 5, 2023
Recent typing-inspect is required for support a PEP 604 (A | B) union
notation. (See issue #226.)
@dairiki
Copy link
Collaborator

dairiki commented Jan 5, 2023

It seems that marshmallow-dataclass only specifies typing-inspect>=0.7.1 in its setup.py, so I think this actually is a bug after all.

I've just pushed 1d0f019 which pins typing-inspect>=0.8.0.

Thanks, @hydrargyrum and @otonnesen, for the report and diagnosis.

Let me know if there's a need for an immediate new release (of marshmallow-dataclass), otherwise, I'll wait until there are more changes before making the next release.

@dairiki dairiki closed this as completed Jan 5, 2023
@dairiki dairiki added the bug Something isn't working label Jan 5, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants