Title: 1.17.0 regression: dict literals incompatible with Sequence[TypedDict] · Issue #19483 · python/mypy · GitHub
Open Graph Title: 1.17.0 regression: dict literals incompatible with Sequence[TypedDict] · Issue #19483 · python/mypy
X Title: 1.17.0 regression: dict literals incompatible with Sequence[TypedDict] · Issue #19483 · python/mypy
Description: Bug Report (yes I used claude code to sum the issue up) Summary mypy 1.17.0 incorrectly reports type errors when using dict literals that should be compatible with Sequence[TypedDict] fields. This worked correctly in mypy 1.16.1 and repr...
Open Graph Description: Bug Report (yes I used claude code to sum the issue up) Summary mypy 1.17.0 incorrectly reports type errors when using dict literals that should be compatible with Sequence[TypedDict] fields. This ...
X Description: Bug Report (yes I used claude code to sum the issue up) Summary mypy 1.17.0 incorrectly reports type errors when using dict literals that should be compatible with Sequence[TypedDict] fields. This ...
Opengraph URL: https://github.com/python/mypy/issues/19483
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"1.17.0 regression: dict literals incompatible with Sequence[TypedDict]","articleBody":"## Bug Report\n\n(yes I used claude code to sum the issue up)\n\n### Summary\nmypy 1.17.0 incorrectly reports type errors when using dict literals that should be compatible with `Sequence[TypedDict]` fields. This worked correctly in mypy 1.16.1 and represents a regression in TypedDict structural typing.\n\n### Expected Behavior\nDict literals with the correct structure should be accepted when assigned to fields expecting `Sequence[TypedDict]`, following structural typing principles that TypedDict is supposed to provide.\n\n### Actual Behavior\nmypy 1.17.0 reports:\n```\nerror: Incompatible types (expression has type \"list[dict[str, str]]\", TypedDict item \"inputs\" has type \"Sequence[Component]\") [typeddict-item]\n```\n\n### Environment\n- **mypy version**: 1.17.0 (fails) vs 1.16.1 (works)\n- **Python version**: 3.11.9\n- **Platform**: Linux\n- **Dependencies**: None (pure `typing` module)\n\n### Minimal Reproducible Example\n\nSave as `test_regression.py`:\n\n```python\nclass Component(TypedDict):\n \"\"\"Simulates ABIComponent from eth_typing\"\"\"\n type: str\n name: NotRequired[str]\n components: NotRequired[Sequence['Component']]\n\nclass Function(TypedDict):\n \"\"\"Simulates ABIFunction from eth_typing\"\"\"\n type: Literal['function']\n name: str\n stateMutability: Literal['pure', 'view', 'nonpayable', 'payable']\n inputs: NotRequired[Sequence[Component]]\n outputs: NotRequired[Sequence[Component]]\n\n# This should work according to TypedDict structural typing rules\n# Works in mypy 1.16.1, fails in mypy 1.17.0\n\n# Simple case\nsimple_function: Function = {\n 'type': 'function',\n 'name': 'test',\n 'stateMutability': 'view',\n 'inputs': [{'type': 'uint256', 'name': 'value'}], # Error in 1.17.0\n 'outputs': [{'type': 'bool'}] # Error in 1.17.0\n}\n\n# Nested case (components within components)\ncomplex_function: Function = {\n 'type': 'function', \n 'name': 'complex',\n 'stateMutability': 'view',\n 'inputs': [\n {'type': 'tuple', 'components': [ # Error in 1.17.0\n {'type': 'uint256', 'name': 'amount'},\n {'type': 'address', 'name': 'recipient'}\n ]}\n ]\n}\n\n# Direct assignment to Sequence should also fail\ncomponents_list: Sequence[Component] = [\n {'type': 'uint256', 'name': 'value'}, # Error in 1.17.0\n {'type': 'address'} # Error in 1.17.0 \n]\n\n# List of functions\nfunction_list: list[Function] = [\n {\n 'type': 'function',\n 'name': 'func1', \n 'stateMutability': 'pure',\n 'inputs': [{'type': 'uint256'}] # Error in 1.17.0\n }\n]\n```\n\n### Steps to Reproduce\n1. Save the code above as `test_regression.py`\n2. Run with mypy 1.16.1: `mypy test_regression.py` → ✅ Success\n3. Run with mypy 1.17.0: `mypy test_regression.py` → ❌ Fails\n\n### Error Output (mypy 1.17.0)\n```\nstandalone_bug_test.py:43: error: Incompatible types (expression has type \"list[dict[str, str]]\", TypedDict item \"components\" has type \"Sequence[Component]\") [typeddict-item]\nstandalone_bug_test.py:62: error: Incompatible types (expression has type \"list[dict[str, str]]\", TypedDict item \"inputs\" has type \"Sequence[Component]\") [typeddict-item]\n```\n\n### Analysis\nThis is a clear regression where mypy 1.17.0 is no longer properly recognizing dict literals as structurally compatible with TypedDict types when used in `Sequence[TypedDict]` contexts. The fundamental principle of TypedDict structural typing is broken.\n\n### Root Cause\nThe issue appears to be in mypy's type inference logic where:\n1. Dict literals inside lists are inferred as `dict[str, str]` instead of the contextually expected TypedDict\n2. This inference happens before structural compatibility is checked\n3. The resulting `list[dict[str, str]]` is then (correctly) rejected as incompatible with `Sequence[TypedDict]`\n\n### Expected Fix\nDict literals should be contextually typed when the expected type is `Sequence[TypedDict]`, allowing structural compatibility to work as intended.\n\n### Workarounds\n- Use `# type: ignore[typeddict-item]` or `# type: ignore[assignment]` comments\n- Use explicit `cast(list[Component], [...])` \n- Use explicit TypedDict construction: `Component(type='uint256', name='value')`\n- Downgrade to mypy 1.16.1","author":{"url":"https://github.com/LefterisJP","@type":"Person","name":"LefterisJP"},"datePublished":"2025-07-20T14:40:13.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/19483/mypy/issues/19483"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:ec55d2af-13f5-f6a2-1399-bea797b5737b |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | EE46:1A68FF:1E441E3:280F60A:6A5C9A8C |
| html-safe-nonce | 9fcf8f87833b915c3b4f49581f373127f278df7df376d86bf3c6ff7457ab8770 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFRTQ2OjFBNjhGRjoxRTQ0MUUzOjI4MEY2MEE6NkE1QzlBOEMiLCJ2aXNpdG9yX2lkIjoiNjA2MjgzMjgzMTAzNDA3MTY5MiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 96622d268e3ae0c2524e433174b12458a1ad1bf4b76ece56bf9ac4145e9134ce |
| hovercard-subject-tag | issue:3246421633 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/mypy/19483/issue_layout |
| twitter:image | https://opengraph.githubassets.com/991f97f05be5f0894d7b7e62febbcceb8c514f6ad4b5b2f1ae55a50532ab53a4/python/mypy/issues/19483 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/991f97f05be5f0894d7b7e62febbcceb8c514f6ad4b5b2f1ae55a50532ab53a4/python/mypy/issues/19483 |
| og:image:alt | Bug Report (yes I used claude code to sum the issue up) Summary mypy 1.17.0 incorrectly reports type errors when using dict literals that should be compatible with Sequence[TypedDict] fields. This ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | LefterisJP |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5290d7e14309ad1e76106a9c4237bd1041517e83ea182c8ab756752cb0c6940b |
| turbo-cache-control | no-preview |
| go-import | github.com/python/mypy git https://github.com/python/mypy.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 7053637 |
| octolytics-dimension-repository_nwo | python/mypy |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 7053637 |
| octolytics-dimension-repository_network_root_nwo | python/mypy |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 9c975978430e9ad293956f2bbdaf153b1bd84a99 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width