Skip to content

Detailed 'signature incompatible with supertype' for non-callables#15263

Merged
hauntsaninja merged 5 commits intopython:masterfrom
ikonst:signature_incompatible_with_supertype-non_callable
May 21, 2023
Merged

Detailed 'signature incompatible with supertype' for non-callables#15263
hauntsaninja merged 5 commits intopython:masterfrom
ikonst:signature_incompatible_with_supertype-non_callable

Conversation

@ikonst
Copy link
Copy Markdown
Contributor

@ikonst ikonst commented May 18, 2023

Previously the "signature incompatible with supertype" error only included detailed comparison when both types are callables; now it will compare in all cases.

@github-actions

This comment has been minimized.

@ikonst
Copy link
Copy Markdown
Contributor Author

ikonst commented May 18, 2023

p.s. given how common cases like this are

+ discord/channel.py:223: note:      Superclass:
+ discord/channel.py:223: note:          ChannelType
+ discord/channel.py:223: note:      Subclass:
+ discord/channel.py:223: note:          Literal[ChannelType.text, ChannelType.news]

would it be useful for this case to emit the "This violates the Liskov substitution principle" notes too, or is it too much text and/or we're being too prescriptive?

cc @ChetanKhanna who authored (and @JukkaL who reviewed) #8866

@github-actions

This comment has been minimized.

@ikonst
Copy link
Copy Markdown
Contributor Author

ikonst commented May 19, 2023

Last lines in ibis diffs seem weird — update: addressed in a008448

@github-actions
Copy link
Copy Markdown
Contributor

Diff from mypy_primer, showing the effect of this PR on open source code:

Tanjun (https://github.com/FasterSpeeding/Tanjun)
+ tanjun/context/slash.py:1044: note:      Superclass:
+ tanjun/context/slash.py:1044: note:          Optional[ExecutableCommand[SlashContext]]
+ tanjun/context/slash.py:1044: note:      Subclass:
+ tanjun/context/slash.py:1044: note:          Optional[BaseSlashCommand]
+ tanjun/context/message.py:130: note:      Superclass:
+ tanjun/context/message.py:130: note:          Optional[ExecutableCommand[MessageContext]]
+ tanjun/context/message.py:130: note:      Subclass:
+ tanjun/context/message.py:130: note:          Optional[MessageCommand[Any]]
+ tanjun/context/menu.py:101: note:      Superclass:
+ tanjun/context/menu.py:101: note:          Optional[ExecutableCommand[MenuContext]]
+ tanjun/context/menu.py:101: note:      Subclass:
+ tanjun/context/menu.py:101: note:          Optional[MenuCommand[Any, Any]]

manticore (https://github.com/trailofbits/manticore)
+ manticore/platforms/linux.py:359: note:      Superclass:
+ manticore/platforms/linux.py:359: note:          bool
+ manticore/platforms/linux.py:359: note:      Subclass:
+ manticore/platforms/linux.py:359: note:          def closed(self) -> bool

Auto-Split (https://github.com/Avasam/Auto-Split)
+ src/capture_method/__init__.py:102: note:      Superclass:
+ src/capture_method/__init__.py:102: note:      Subclass:
+ src/capture_method/__init__.py:102: note:      Superclass:
+ src/capture_method/__init__.py:102: note:      Subclass:
+ src/capture_method/__init__.py:102: note:      Superclass:
+ src/capture_method/__init__.py:102: note:      Subclass:

sublime_debugger (https://github.com/daveleroy/sublime_debugger)
+ modules/ui/html.py:244: note:      Superclass:
+ modules/ui/html.py:244: note:          float | None
+ modules/ui/html.py:244: note:      Subclass:
+ modules/ui/html.py:244: note:          def width(self) -> float
+ modules/ui/html.py:244: note:      Superclass:
+ modules/ui/html.py:244: note:          float | None
+ modules/ui/html.py:244: note:      Subclass:
+ modules/ui/html.py:244: note:          def width(self) -> float
+ modules/breakpoints/data_breakpoints.py:26: note:      Superclass:
+ modules/breakpoints/data_breakpoints.py:26: note:          str
+ modules/breakpoints/data_breakpoints.py:26: note:      Subclass:
+ modules/breakpoints/data_breakpoints.py:26: note:          str | None

operator (https://github.com/canonical/operator)
+ ops/model.py:783: note:      Superclass:
+ ops/model.py:783: note:      Subclass:
+ ops/framework.py:1252: note:      Superclass:
+ ops/framework.py:1252: note:      Subclass:

steam.py (https://github.com/Gobot1234/steam.py)
+ steam/ext/commands/utils.py:36: note:      Superclass:
+ steam/ext/commands/utils.py:36: note:      Subclass:
+ steam/ext/commands/utils.py:47: note:      Superclass:
+ steam/ext/commands/utils.py:47: note:      Subclass:
+ steam/ext/commands/help.py:130: note:      Superclass:
+ steam/ext/commands/help.py:130: note:          Err
+ steam/ext/commands/help.py:130: note:      Subclass:
+ steam/ext/commands/help.py:130: note:          def on_error(self, ctx: Context, error: Exception) -> Coroutine[Any, Any, None]

spark (https://github.com/apache/spark)
+ python/pyspark/ml/classification.py:877: note:      Superclass:
+ python/pyspark/ml/classification.py:877: note:          LinearSVCTrainingSummary
+ python/pyspark/ml/classification.py:877: note:      Subclass:
+ python/pyspark/ml/classification.py:877: note:          def summary(self) -> LinearSVCTrainingSummary
+ python/pyspark/ml/classification.py:3323: note:      Superclass:
+ python/pyspark/ml/classification.py:3323: note:          MultilayerPerceptronClassificationTrainingSummary
+ python/pyspark/ml/classification.py:3323: note:      Subclass:
+ python/pyspark/ml/classification.py:3323: note:          def summary(self) -> MultilayerPerceptronClassificationTrainingSummary

prefect (https://github.com/PrefectHQ/prefect)
+ src/prefect/utilities/annotations.py:48: note:      Superclass:
+ src/prefect/utilities/annotations.py:48: note:      Subclass:
+ src/prefect/_internal/concurrency/api.py:158: note:      Superclass:
+ src/prefect/_internal/concurrency/api.py:158: note:          abstractstaticmethod[[Callable[[], T] | Call[T], float | None, Iterable[Call[Any]] | None], T]
+ src/prefect/_internal/concurrency/api.py:158: note:      Subclass:
+ src/prefect/_internal/concurrency/api.py:158: note:          @staticmethod
+ src/prefect/_internal/concurrency/api.py:158: note:          def [T] wait_for_call_in_loop_thread(Callable[[], Awaitable[T]] | Call[Awaitable[T]], /, timeout: float | None = ..., done_callbacks: Iterable[Call[Any]] | None = ..., contexts: Iterable[AbstractContextManager[Any]] | None = ...) -> Coroutine[Any, Any, Awaitable[T]]
+ src/prefect/_internal/concurrency/api.py:176: note:      Superclass:
+ src/prefect/_internal/concurrency/api.py:176: note:          abstractstaticmethod[[Callable[[], T] | Call[T], float | None, Iterable[Call[Any]] | None], T]
+ src/prefect/_internal/concurrency/api.py:176: note:      Subclass:
+ src/prefect/_internal/concurrency/api.py:176: note:          @staticmethod
+ src/prefect/_internal/concurrency/api.py:176: note:          def [T] wait_for_call_in_new_thread(Callable[[], T] | Call[T], /, timeout: float | None = ..., done_callbacks: Iterable[Call[Any]] | None = ...) -> Coroutine[Any, Any, Call[T]]
+ src/prefect/_internal/concurrency/api.py:214: note:      Superclass:
+ src/prefect/_internal/concurrency/api.py:214: note:          abstractstaticmethod[[Callable[[], T] | Call[T], float | None, Iterable[Call[Any]] | None], T]
+ src/prefect/_internal/concurrency/api.py:214: note:      Subclass:
+ src/prefect/_internal/concurrency/api.py:214: note:          @staticmethod
+ src/prefect/_internal/concurrency/api.py:214: note:          def [T] wait_for_call_in_loop_thread(Callable[[], Awaitable[T]] | Callable[[], Awaitable[T]] | Call[Awaitable[T]], /, timeout: float | None = ..., done_callbacks: Iterable[Call[Any]] | None = ..., contexts: Iterable[AbstractContextManager[Any]] | None = ...) -> Awaitable[T]
+ src/prefect/_internal/concurrency/api.py:235: note:      Superclass:
+ src/prefect/_internal/concurrency/api.py:235: note:          abstractstaticmethod[[Callable[[], T] | Call[T], float | None, Iterable[Call[Any]] | None], T]
+ src/prefect/_internal/concurrency/api.py:235: note:      Subclass:
+ src/prefect/_internal/concurrency/api.py:235: note:          @staticmethod
+ src/prefect/_internal/concurrency/api.py:235: note:          def [T] wait_for_call_in_new_thread(Callable[[], T] | Call[T], /, timeout: float | None = ..., done_callbacks: Iterable[Call[Any]] | None = ...) -> Call[T]
+ src/prefect/results.py:402: note:      Superclass:
+ src/prefect/results.py:402: note:          abstractclassmethod[type[BaseResult[R]], [R, KwArg(Any)], Coroutine[Any, Any, BaseResult[R]]]
+ src/prefect/results.py:402: note:      Subclass:
+ src/prefect/results.py:402: note:          @classmethod
+ src/prefect/results.py:402: note:          def [R] create(cls, obj: R, cache_object: bool = ...) -> Coroutine[Any, Any, UnpersistedResult]
+ src/prefect/results.py:439: note:      Superclass:
+ src/prefect/results.py:439: note:          abstractclassmethod[type[BaseResult[R]], [R, KwArg(Any)], Coroutine[Any, Any, BaseResult[R]]]
+ src/prefect/results.py:439: note:      Subclass:
+ src/prefect/results.py:439: note:          @classmethod
+ src/prefect/results.py:439: note:          def [R] create(cls, obj: R) -> Coroutine[Any, Any, LiteralResult]
+ src/prefect/results.py:511: note:      Superclass:
+ src/prefect/results.py:511: note:          abstractclassmethod[type[BaseResult[R]], [R, KwArg(Any)], Coroutine[Any, Any, BaseResult[R]]]
+ src/prefect/results.py:511: note:      Subclass:
+ src/prefect/results.py:511: note:          @classmethod
+ src/prefect/results.py:511: note:          def [R] create(cls, obj: R, storage_block: WritableFileSystem, storage_block_id: UUID, storage_key_fn: Callable[[], str], serializer: Serializer[Any], cache_object: bool = ...) -> Coroutine[Any, Any, PersistedResult]

ibis (https://github.com/ibis-project/ibis)
+ ibis/common/grounds.py:93: note:      Superclass:
+ ibis/common/grounds.py:93: note:          classmethod[type, [VarArg(Any), KwArg(Any)], Any]
+ ibis/common/grounds.py:93: note:      Subclass:
+ ibis/common/grounds.py:93: note:          @classmethod
+ ibis/common/grounds.py:93: note:          def __create__(cls, *args: Any, **kwargs: Any) -> Annotable
+ ibis/common/grounds.py:175: note:      Superclass:
+ ibis/common/grounds.py:175: note:          classmethod[type, [VarArg(Any), KwArg(Any)], Any]
+ ibis/common/grounds.py:175: note:      Subclass:
+ ibis/common/grounds.py:175: note:          @classmethod
+ ibis/common/grounds.py:175: note:          def __create__(cls, *args: Any, **kwargs: Any) -> Singleton
+ ibis/expr/operations/window.py:47: note:      Superclass:
+ ibis/expr/operations/window.py:47: note:          DataType
+ ibis/expr/operations/window.py:47: note:      Subclass:
+ ibis/expr/operations/window.py:47: note:          def output_dtype(self) -> DataType
+ ibis/backends/datafusion/__init__.py:64: note:      Superclass:
+ ibis/backends/datafusion/__init__.py:64: note:          str | None
+ ibis/backends/datafusion/__init__.py:64: note:      Subclass:
+ ibis/backends/datafusion/__init__.py:64: note:          def current_database(self) -> str
+ ibis/backends/pyspark/__init__.py:570: note:      Superclass:
+ ibis/backends/pyspark/__init__.py:570: note:      Subclass:
+ ibis/backends/dask/__init__.py:96: note:      Superclass:
+ ibis/backends/dask/__init__.py:96: note:      Subclass:
+ ibis/backends/trino/__init__.py:26: note:      Superclass:
+ ibis/backends/trino/__init__.py:26: note:          str
+ ibis/backends/trino/__init__.py:26: note:      Subclass:
+ ibis/backends/trino/__init__.py:26: note:          def current_database(self) -> str
+ ibis/backends/trino/__init__.py:26: note:      Superclass:
+ ibis/backends/trino/__init__.py:26: note:          str | None
+ ibis/backends/trino/__init__.py:26: note:      Subclass:
+ ibis/backends/trino/__init__.py:26: note:          def current_database(self) -> str
+ ibis/backends/duckdb/__init__.py:62: note:      Superclass:
+ ibis/backends/duckdb/__init__.py:62: note:          str
+ ibis/backends/duckdb/__init__.py:62: note:      Subclass:
+ ibis/backends/duckdb/__init__.py:62: note:          def current_database(self) -> str
+ ibis/backends/duckdb/__init__.py:62: note:      Superclass:
+ ibis/backends/duckdb/__init__.py:62: note:          str | None
+ ibis/backends/duckdb/__init__.py:62: note:      Subclass:
+ ibis/backends/duckdb/__init__.py:62: note:          def current_database(self) -> str

discord.py (https://github.com/Rapptz/discord.py)
+ discord/invite.py:507: note:      Superclass:
+ discord/invite.py:507: note:          int
+ discord/invite.py:507: note:      Subclass:
+ discord/invite.py:507: note:          str
+ discord/channel.py:223: note:      Superclass:
+ discord/channel.py:223: note:          ChannelType
+ discord/channel.py:223: note:      Subclass:
+ discord/channel.py:223: note:          Literal[ChannelType.text, ChannelType.news]
+ discord/channel.py:1341: note:      Superclass:
+ discord/channel.py:1341: note:          ChannelType
+ discord/channel.py:1341: note:      Subclass:
+ discord/channel.py:1341: note:          Literal[ChannelType.voice]
+ discord/channel.py:1580: note:      Superclass:
+ discord/channel.py:1580: note:          ChannelType
+ discord/channel.py:1580: note:      Subclass:
+ discord/channel.py:1580: note:          Literal[ChannelType.stage_voice]
+ discord/channel.py:1845: note:      Superclass:
+ discord/channel.py:1845: note:          ChannelType
+ discord/channel.py:1845: note:      Subclass:
+ discord/channel.py:1845: note:          Literal[ChannelType.category]
+ discord/channel.py:2260: note:      Superclass:
+ discord/channel.py:2260: note:          ChannelType
+ discord/channel.py:2260: note:      Subclass:
+ discord/channel.py:2260: note:          Literal[ChannelType.forum]
+ discord/webhook/sync.py:406: note:      Superclass:
+ discord/webhook/sync.py:406: note:      Subclass:
+ discord/webhook/async_.py:774: note:      Superclass:
+ discord/webhook/async_.py:774: note:      Subclass:
+ discord/ui/select.py:298: note:      Superclass:
+ discord/ui/select.py:298: note:          list[str | User | Member | Role | AppCommandChannel | AppCommandThread | Role | Member | Role | User]
+ discord/ui/select.py:298: note:      Subclass:
+ discord/ui/select.py:298: note:          list[str]
+ discord/ui/select.py:446: note:      Superclass:
+ discord/ui/select.py:446: note:          list[str | User | Member | Role | AppCommandChannel | AppCommandThread | Role | Member | Role | User]
+ discord/ui/select.py:446: note:      Subclass:
+ discord/ui/select.py:446: note:          list[Member | User]
+ discord/ui/select.py:515: note:      Superclass:
+ discord/ui/select.py:515: note:          list[str | User | Member | Role | AppCommandChannel | AppCommandThread | Role | Member | Role | User]
+ discord/ui/select.py:515: note:      Subclass:
+ discord/ui/select.py:515: note:          list[Role]
+ discord/ui/select.py:579: note:      Superclass:
+ discord/ui/select.py:579: note:          list[str | User | Member | Role | AppCommandChannel | AppCommandThread | Role | Member | Role | User]
+ discord/ui/select.py:579: note:      Subclass:
+ discord/ui/select.py:579: note:          list[Member | User | Role]
+ discord/ui/select.py:668: note:      Superclass:
+ discord/ui/select.py:668: note:          list[str | User | Member | Role | AppCommandChannel | AppCommandThread | Role | Member | Role | User]
+ discord/ui/select.py:668: note:      Subclass:
+ discord/ui/select.py:668: note:          list[AppCommandChannel | AppCommandThread]

@ikonst
Copy link
Copy Markdown
Contributor Author

ikonst commented May 21, 2023

👋 @ChetanKhanna @JukkaL

Seeing duplication in AutoSplit:

src/capture_method/__init__.py:102: error: Signature of "get" incompatible with supertype "dict"  [override]
src/capture_method/__init__.py:102: note:      Superclass:
src/capture_method/__init__.py:102: note:          @overload
src/capture_method/__init__.py:102: note:          def get(self, CaptureMethodEnum, /) -> CaptureMethodInfo | None
src/capture_method/__init__.py:102: note:          @overload
src/capture_method/__init__.py:102: note:          def [_T] get(self, CaptureMethodEnum, CaptureMethodInfo | _T, /) -> CaptureMethodInfo | _T
src/capture_method/__init__.py:102: note:      Subclass:
src/capture_method/__init__.py:102: note:          def get(self, CaptureMethodEnum, /) -> Any
src/capture_method/__init__.py:102: error: Signature of "get" incompatible with supertype "Mapping"  [override]
src/capture_method/__init__.py:102: note:      Superclass:
src/capture_method/__init__.py:102: note:          @overload
src/capture_method/__init__.py:102: note:          def get(self, CaptureMethodEnum, /) -> CaptureMethodInfo | None
src/capture_method/__init__.py:102: note:          @overload
src/capture_method/__init__.py:102: note:          def [_T] get(self, CaptureMethodEnum, /, default: CaptureMethodInfo | _T) -> CaptureMethodInfo | _T
src/capture_method/__init__.py:102: note:      Subclass:
src/capture_method/__init__.py:102: note:          def get(self, CaptureMethodEnum, /) -> Any
src/capture_method/__init__.py:102: note:      Superclass:
src/capture_method/__init__.py:102: note:          @overload
src/capture_method/__init__.py:102: note:          def get(self, CaptureMethodEnum, /) -> CaptureMethodInfo | None
src/capture_method/__init__.py:102: note:          @overload
src/capture_method/__init__.py:102: note:          def [_T] get(self, CaptureMethodEnum, CaptureMethodInfo | _T, /) -> CaptureMethodInfo | _T
src/capture_method/__init__.py:102: note:      Subclass:
src/capture_method/__init__.py:102: note:          def get(self, CaptureMethodEnum, /) -> Any
src/capture_method/__init__.py:102: note:      Superclass:
src/capture_method/__init__.py:102: note:          @overload
src/capture_method/__init__.py:102: note:          def get(self, CaptureMethodEnum, /) -> CaptureMethodInfo | None
src/capture_method/__init__.py:102: note:          @overload
src/capture_method/__init__.py:102: note:          def [_T] get(self, CaptureMethodEnum, /, default: CaptureMethodInfo | _T) -> CaptureMethodInfo | _T
src/capture_method/__init__.py:102: note:      Subclass:
src/capture_method/__init__.py:102: note:          def get(self, CaptureMethodEnum, /) -> Any

I don't think we should address it here. Rather, let's address holistically in #15273.

Copy link
Copy Markdown
Collaborator

@hauntsaninja hauntsaninja left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, looks great!

@hauntsaninja hauntsaninja merged commit c2d02a3 into python:master May 21, 2023
@ikonst ikonst deleted the signature_incompatible_with_supertype-non_callable branch May 21, 2023 20:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants