from mypy.plugin import Plugin from mypy.plugins.common import add_attribute_to_class from mypy.types import NoneType, UnionType class SympyPlugin(Plugin): def get_base_class_hook(self, fullname: str): if fullname == "sympy.core.basic.Basic": return add_assumptions return None def add_assumptions(ctx) -> None: # Generated by list(sys.modules['sympy.core.assumptions']._assume_defined) # (do not import sympy to speedup mypy plugin load time) assumptions = [ "hermitian", "prime", "noninteger", "negative", "antihermitian", "infinite", "finite", "irrational", "extended_positive", "nonpositive", "odd", "algebraic", "integer", "rational", "extended_real", "nonnegative", "transcendental", "extended_nonzero", "extended_negative", "composite", "complex", "imaginary", "nonzero", "zero", "even", "positive", "polar", "extended_nonpositive", "extended_nonnegative", "real", "commutative", ] for a in assumptions: add_attribute_to_class( ctx.api, ctx.cls, f"is_{a}", UnionType([ctx.api.named_type("builtins.bool"), NoneType()]), ) def plugin(version: str): return SympyPlugin