Skip to content

dataclasses.make_dataclass should accept Any, not type #11653

Description

@alexei

It has been reported before about UnionType vs type. The original bug mentioned something like:

def f1(a: type) -> None:
    ...


f1(int | None)

Resulting in:

Argument 1 to "f1" has incompatible type "UnionType"; expected "type"

The issue has been dismissed saying that UnionType was not a type. But sometimes strange things happen (from a developer's perspective).

Defining a data class in a declarative style works fine:

@dataclass
class D1:
    a: int | None

But doing the same thing programatically fails:

D2 = make_dataclass("D2", [("a", int | None)])

Results in:

List item 0 has incompatible type "tuple[str, UnionType]"; expected "str | tuple[str, type] | tuple[str, type, Any]"

Because UnionType is a class, mypy is technically correct, but isn't the situation ridiculous? D1.a is a UnionType and that wasn't a problem before, but with D2 it is.

Defining named tuples works fine either way:

class NT1(NamedTuple):
    a: int | None


NT2 = NamedTuple("NT2", [("a", int | None)])

Fine, if UnionType is not a union type, then what is the way to express a union type?

See https://mypy-play.net/?mypy=latest&python=3.12&gist=92e2f18ed8b463b0d7675c50bb73ee99

Activity

erictraut commented on Mar 23, 2024

@erictraut
Contributor

I think this is a bug in the type definition for make_dataclass in the typeshed stubs. Mypy is correct to generate an error here given the current definition.

AlexWaygood commented on Mar 23, 2024

@AlexWaygood
Member

Yes, Eric's right — our typeshed definition says that you need to provide instances of type to make_dataclass, but really anything valid as a type annotation is arguably okay here. That's inexpressible without something like python/mypy#9773 (which will need a PEP), so we should probably just use Any in typeshed for now.

@JelleZijlstra or @hauntsaninja, could you transfer this issue over to typeshed?

transferred this issue frompython/mypyon Mar 23, 2024
changed the title [-]Expected "type", found "UnionType"[/-] [+]`dataclasses.make_dataclass` should accept Any, not type[/+] on Mar 24, 2024
added
help wantedAn actionable problem of low to medium complexity where a PR would be very welcome
on Mar 24, 2024

alexei commented on Mar 25, 2024

@alexei
ContributorAuthor

I opened a PR #11657

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedAn actionable problem of low to medium complexity where a PR would be very welcomestubs: false positiveType checkers report false errors

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions