From e9bcdc910a2101c0da2fa379da36e1d1be2fe3f2 Mon Sep 17 00:00:00 2001 From: Lex Neva Date: Thu, 21 Aug 2025 16:10:48 -0400 Subject: fix type errors (#3928) * fix type checking error in overriding path propery * fix type hints in sew stack * enable type checking for tartan * ignore type warnings for dynamic wx module attributes * fix tartan type errors * fix circular import * add type-check and test targets * use Optional instead --- lib/sew_stack/stitch_layers/mixins/protocol.py | 50 ++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 lib/sew_stack/stitch_layers/mixins/protocol.py (limited to 'lib/sew_stack/stitch_layers/mixins/protocol.py') diff --git a/lib/sew_stack/stitch_layers/mixins/protocol.py b/lib/sew_stack/stitch_layers/mixins/protocol.py new file mode 100644 index 00000000..1057bd7b --- /dev/null +++ b/lib/sew_stack/stitch_layers/mixins/protocol.py @@ -0,0 +1,50 @@ +from typing import Protocol, TYPE_CHECKING + +from lib.utils import DotDict, Point + + +if TYPE_CHECKING: + from lib.sew_stack import SewStack + + +class LayerProtocol(Protocol): + paths: 'list[list[Point]]' + config: DotDict + element: 'SewStack' + + +def with_protocol(protocol): + """Include a protocol in a Mixin only for type hinting. + + Normally we'd use a protocol in a mixin to indicate that we + expect certain attributes to be available on self, as + described here: + + https://mypy.readthedocs.io/en/stable/more_types.html#mixin-classes + + However, for some reason type-checkers then _only_ allow use of + properties on self that are defined in the protocol. For example, + this doesn't work: + + class MyMixin: + def foo(self): + return "hi" + + def bar(self: LayerProtocol): + thing = self.foo() + if self.config.baz == thing: + ... + + This fails because mypy says that "self.foo()" references unknown + attribute "foo"... even though it's defined right there in MyMixin. + This feels a little weird, but that's how it works. + + Instead, we do it like this: + + class MyMixin(with_protocol(LayerProtocol)): + ... + """ + if TYPE_CHECKING: + return protocol + else: + return object -- cgit v1.2.3