python / mypy

Optional static typing for Python
https://www.mypy-lang.org/
Other
18.59k stars 2.85k forks source link

Stubs and use of `@deprecated` names #18007

Open JelleZijlstra opened 1 month ago

JelleZijlstra commented 1 month ago

Running stubtest from mypy main on typeshed produces:

error: not checking stubs due to mypy build errors:
stdlib/asyncio/events.pyi:23: note: class asyncio.unix_events.AbstractChildWatcher is deprecated: Deprecated as of Python 3.12; will be removed in Python 3.14  [deprecated]
stdlib/unittest/__init__.pyi:53: note: function unittest.loader.findTestCases is deprecated: Deprecated in Python 3.11; removal scheduled for Python 3.13  [deprecated]
stdlib/unittest/__init__.pyi:53: note: function unittest.loader.getTestCaseNames is deprecated: Deprecated in Python 3.11; removal scheduled for Python 3.13  [deprecated]
stdlib/unittest/__init__.pyi:53: note: function unittest.loader.makeSuite is deprecated: Deprecated in Python 3.11; removal scheduled for Python 3.13  [deprecated]

Which is not very useful. Maybe we should suppress deprecated in typeshed's configuration or in stubtest in general.

JelleZijlstra commented 1 month ago

(I added a topic-pep-702 label, @tyralla fyi.)

hauntsaninja commented 1 month ago

I think suppressing all deprecated errors in stubs could make sense

JelleZijlstra commented 1 month ago

I feel that might be too much; if we deprecate something in _typeshed, we'd want mypy to tell stub authors about it.

hauntsaninja commented 1 month ago

We could just special case typeshed stubs in particular then (mypy already does this in a few places)

(And in general that feels niche / for type-only programs removals don't feel too much more disruptive than deprecations)

tyralla commented 1 month ago

Do you mean just extending the current warn_deprecated method like this?

    def warn_deprecated(self, node: SymbolNode | None, context: Context) -> None:
        """Warn if deprecated."""
        if isinstance(node, Decorator):
            node = node.func
        if isinstance(node, (FuncDef, OverloadedFuncDef, TypeInfo)) and (
            (deprecated := node.deprecated) is not None
        ) and not self.is_typeshed_stub:  # !!!
            warn = self.msg.fail if self.options.report_deprecated_as_error else self.msg.note
            warn(deprecated, context, code=codes.DEPRECATED)

If so (and if it works, not checked so far), I could modify PR #17926 accordingly, which still suffers under typeshed issues.

(Thanks for the new label, @JelleZijlstra.)

hauntsaninja commented 1 month ago

Yup!

tyralla commented 1 month ago

Seems I am starting to learn some Mypy slang ;-)