crates/ty_python_semantic/resources/lint_docs/call-abstract-method.md
Checks for calls to abstract @classmethods or @staticmethods with "trivial bodies" when accessed
on the class object itself.
"Trivial bodies" are bodies that solely consist of ..., pass, a docstring, and/or
raise NotImplementedError.
An abstract method with a trivial body has no concrete implementation to execute, so calling such a method directly on the class will probably not have the desired effect.
It is also unsound to call these methods directly on the class. Unlike other methods, ty permits
abstract methods with trivial bodies to have non-None return types even though they always return
None at runtime. This is because it is expected that these methods will always be overridden
rather than being called directly. As a result of this exception to the normal rule, ty may infer an
incorrect type if one of these methods is called directly, which may then mean that type errors
elsewhere in your code go undetected by ty.
Calling abstract classmethods or staticmethods via type[X] is allowed, since the actual runtime
type could be a concrete subclass with an implementation.
from abc import ABC, abstractmethod
class Foo(ABC):
@classmethod
@abstractmethod
def method(cls) -> int: ...
# cannot call abstract classmethod
Foo.method() # error