Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mypy/semanal.py
Original file line number Diff line number Diff line change
Expand Up @@ -2688,7 +2688,7 @@ def configure_tuple_base_class(self, defn: ClassDef, base: TupleType) -> Instanc
if info.tuple_type and info.tuple_type != base and not has_placeholder(info.tuple_type):
self.fail("Class has two incompatible bases derived from tuple", defn)
defn.has_incompatible_baseclass = True
if info.special_alias and has_placeholder(info.special_alias.target):
if has_placeholder(base):
self.process_placeholder(
None, "tuple base", defn, force_progress=base != info.tuple_type
)
Expand Down
2 changes: 1 addition & 1 deletion mypy/semanal_namedtuple.py
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,7 @@ def build_namedtuple_typeinfo(
info = existing_info or self.api.basic_new_typeinfo(name, fallback, line)
info.is_named_tuple = True
tuple_base = TupleType(types, fallback)
if info.special_alias and has_placeholder(info.special_alias.target):
if has_placeholder(tuple_base):
self.api.process_placeholder(
None, "NamedTuple item", info, force_progress=tuple_base != info.tuple_type
)
Expand Down
2 changes: 1 addition & 1 deletion mypy/semanal_typeddict.py
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ def build_typeddict_typeinfo(
assert fallback is not None
info = existing_info or self.api.basic_new_typeinfo(name, fallback, line)
typeddict_type = TypedDictType(item_types, required_keys, readonly_keys, fallback)
if info.special_alias and has_placeholder(info.special_alias.target):
if has_placeholder(typeddict_type):
self.api.process_placeholder(
None, "TypedDict item", info, force_progress=typeddict_type != info.typeddict_type
)
Expand Down
28 changes: 28 additions & 0 deletions test-data/unit/check-typeddict.test
Original file line number Diff line number Diff line change
Expand Up @@ -4581,3 +4581,31 @@ bad({"x": "foo"}) # E: Dict entry 0 has incompatible type "str": "str"; expecte

[builtins fixtures/dict.pyi]
[typing fixtures/typing-typeddict.pyi]

[case testTypedDictUnpackImportCycle]
import mre

[file mre.py]
from mre_pkg.model import Callback
Callback(callback=1) # E: Argument "callback" to "Callback" has incompatible type "int"; expected "Callback"

[file mre_pkg/model.pyi]
from typing_extensions import Unpack, TYPE_CHECKING, TypedDict
from .callbacks import Callback as Callback

class _ModelInit(TypedDict, total=False):
callback: Callback

class Model:
def __init__(self, **kwargs: Unpack[_ModelInit]) -> None: ...

[file mre_pkg/callbacks.pyi]
from typing_extensions import Unpack, TYPE_CHECKING, TypedDict
from .model import Model, _ModelInit

class _CallbackInit(_ModelInit, total=False): ...

class Callback(Model):
def __init__(self, **kwargs: Unpack[_CallbackInit]) -> None: ...
[builtins fixtures/dict.pyi]
[typing fixtures/typing-typeddict.pyi]