Skip to content

TypedDict as default_factory in dataclasses is not inferred correctly #5723

Closed

Description

@iddan
  • Are you reporting a bug, or opening a feature request? bug
  • Please insert below the code you are checking with mypy,
    or a mock-up repro if the source is private. We would appreciate
    if you try to simplify your case to a minimal repro.
from dataclasses import dataclass, field
from mypy_extensions import TypedDict

class Person(TypedDict, total=False):
    name: str

@dataclass
class Job:
    person: Person = field(default_factory=Person)
  • What is the actual behavior/output?
main.py:9: error: Incompatible types in assignment (expression has type "main.Person", variable has type "Person")
  • What is the behavior/output you expect? To pass
  • What are the versions of mypy and Python you are using? latest
    Do you see the same issue after installing mypy from Git master? yes
  • What are the mypy flags you are using? (For example --strict-optional) none

Activity

  1. changed the title [-]TypedDict as default_factory in dataclasses are not inferred correctly[/-] [+]TypedDict as default_factory in dataclasses is not inferred correctly[/+] on Oct 3, 2018
  2. ilevkivskyi commented on Oct 3, 2018

    @ilevkivskyi
    Member

    This is actually not specific to dataclasses. It looks like typed dict class objects are never analyzed properly. There is a hack in visit_call_expr in type checker, that checks them specially, but if they appear in any other context, the corresponding CallableType is not created correctly.

  3. self-assigned this
    on Nov 16, 2018
  4. tsangwpx commented on Nov 4, 2023

    @tsangwpx

    In mypy 1.6.1, the output is

    error: Argument "default_factory" to "field" has incompatible type "Type[Person]"; expected "Callable[[], Person]"  [arg-type]
    

    workaround:

    @dataclass
    class Job:
        person: Person = field(default_factory=lambda: Person())
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions