diff --git a/manim/mobject/text/numbers.py b/manim/mobject/text/numbers.py index 23b1232574..e45b94dd2b 100644 --- a/manim/mobject/text/numbers.py +++ b/manim/mobject/text/numbers.py @@ -4,10 +4,10 @@ __all__ = ["DecimalNumber", "Integer", "Variable"] -from collections.abc import Sequence from typing import Any import numpy as np +from typing_extensions import Self from manim import config from manim.constants import * @@ -16,10 +16,9 @@ from manim.mobject.text.text_mobject import Text from manim.mobject.types.vectorized_mobject import VMobject from manim.mobject.value_tracker import ValueTracker +from manim.typing import Point3DLike -string_to_mob_map = {} - -__all__ = ["DecimalNumber", "Integer", "Variable"] +string_to_mob_map: dict[str, VMobject] = {} class DecimalNumber(VMobject, metaclass=ConvertToOpenGL): @@ -86,7 +85,7 @@ def __init__( self, number: float = 0, num_decimal_places: int = 2, - mob_class: VMobject = MathTex, + mob_class: type[SingleStringMathTex] = MathTex, include_sign: bool = False, group_with_commas: bool = True, digit_buff_per_font_unit: float = 0.001, @@ -94,11 +93,11 @@ def __init__( unit: str | None = None, # Aligned to bottom unless it starts with "^" unit_buff_per_font_unit: float = 0, include_background_rectangle: bool = False, - edge_to_fix: Sequence[float] = LEFT, + edge_to_fix: Point3DLike = LEFT, font_size: float = DEFAULT_FONT_SIZE, stroke_width: float = 0, fill_opacity: float = 1.0, - **kwargs, + **kwargs: Any, ): super().__init__(**kwargs, fill_opacity=fill_opacity, stroke_width=stroke_width) self.number = number @@ -137,12 +136,13 @@ def __init__( self.init_colors() @property - def font_size(self): + def font_size(self) -> float: """The font size of the tex mobject.""" - return self.height / self.initial_height * self._font_size + return_value: float = self.height / self.initial_height * self._font_size + return return_value @font_size.setter - def font_size(self, font_val): + def font_size(self, font_val: float) -> None: if font_val <= 0: raise ValueError("font_size must be greater than 0.") elif self.height > 0: @@ -153,7 +153,7 @@ def font_size(self, font_val): # font_size does not depend on current size. self.scale(font_val / self.font_size) - def _set_submobjects_from_number(self, number): + def _set_submobjects_from_number(self, number: float) -> None: self.number = number self.submobjects = [] @@ -197,12 +197,12 @@ def _set_submobjects_from_number(self, number): self.unit_sign.align_to(self, UP) # track the initial height to enable scaling via font_size - self.initial_height = self.height + self.initial_height: float = self.height if self.include_background_rectangle: self.add_background_rectangle() - def _get_num_string(self, number): + def _get_num_string(self, number: float | complex) -> str: if isinstance(number, complex): formatter = self._get_complex_formatter() else: @@ -215,17 +215,22 @@ def _get_num_string(self, number): return num_string - def _string_to_mob(self, string: str, mob_class: VMobject | None = None, **kwargs): + def _string_to_mob( + self, + string: str, + mob_class: type[SingleStringMathTex] | None = None, + **kwargs: Any, + ) -> VMobject: if mob_class is None: mob_class = self.mob_class if string not in string_to_mob_map: string_to_mob_map[string] = mob_class(string, **kwargs) mob = string_to_mob_map[string].copy() - mob.font_size = self._font_size + mob.font_size = self._font_size # type: ignore[attr-defined] return mob - def _get_formatter(self, **kwargs): + def _get_formatter(self, **kwargs: Any) -> str: """ Configuration is based first off instance attributes, but overwritten by any kew word argument. Relevant @@ -258,7 +263,7 @@ def _get_formatter(self, **kwargs): ], ) - def _get_complex_formatter(self): + def _get_complex_formatter(self) -> str: return "".join( [ self._get_formatter(field_name="0.real"), @@ -267,7 +272,7 @@ def _get_complex_formatter(self): ], ) - def set_value(self, number: float): + def set_value(self, number: float) -> Self: """Set the value of the :class:`~.DecimalNumber` to a new number. Parameters @@ -304,10 +309,10 @@ def set_value(self, number: float): self.init_colors() return self - def get_value(self): + def get_value(self) -> float: return self.number - def increment_value(self, delta_t=1): + def increment_value(self, delta_t: float = 1) -> None: self.set_value(self.get_value() + delta_t) @@ -333,7 +338,7 @@ def __init__( ) -> None: super().__init__(number=number, num_decimal_places=num_decimal_places, **kwargs) - def get_value(self): + def get_value(self) -> int: return int(np.round(super().get_value())) @@ -444,9 +449,9 @@ def __init__( self, var: float, label: str | Tex | MathTex | Text | SingleStringMathTex, - var_type: DecimalNumber | Integer = DecimalNumber, + var_type: type[DecimalNumber | Integer] = DecimalNumber, num_decimal_places: int = 2, - **kwargs, + **kwargs: Any, ): self.label = MathTex(label) if isinstance(label, str) else label equals = MathTex("=").next_to(self.label, RIGHT) diff --git a/manim/mobject/text/tex_mobject.py b/manim/mobject/text/tex_mobject.py index b5a7df4e20..cb46e46cae 100644 --- a/manim/mobject/text/tex_mobject.py +++ b/manim/mobject/text/tex_mobject.py @@ -64,7 +64,7 @@ def __init__( tex_template: TexTemplate | None = None, font_size: float = DEFAULT_FONT_SIZE, color: ParsableManimColor | None = None, - **kwargs, + **kwargs: Any, ): if color is None: color = VMobject().color @@ -110,12 +110,12 @@ def __repr__(self): return f"{type(self).__name__}({repr(self.tex_string)})" @property - def font_size(self): + def font_size(self) -> float: """The font size of the tex mobject.""" return self.height / self.initial_height / SCALE_FACTOR_PER_FONT_POINT @font_size.setter - def font_size(self, font_val): + def font_size(self, font_val: float): if font_val <= 0: raise ValueError("font_size must be greater than 0.") elif self.height > 0: diff --git a/manim/mobject/value_tracker.py b/manim/mobject/value_tracker.py index 9d81035e89..7e8f133774 100644 --- a/manim/mobject/value_tracker.py +++ b/manim/mobject/value_tracker.py @@ -5,6 +5,8 @@ __all__ = ["ValueTracker", "ComplexValueTracker"] +from typing import Any + import numpy as np from manim.mobject.mobject import Mobject @@ -69,7 +71,7 @@ def construct(self): """ - def __init__(self, value=0, **kwargs): + def __init__(self, value: float = 0, **kwargs: Any): super().__init__(**kwargs) self.set(points=np.zeros((1, 3))) self.set_value(value) diff --git a/mypy.ini b/mypy.ini index a69ae2c470..7ca3b4c1c9 100644 --- a/mypy.ini +++ b/mypy.ini @@ -162,9 +162,6 @@ ignore_errors = True [mypy-manim.mobject.table] ignore_errors = True -[mypy-manim.mobject.text.numbers] -ignore_errors = True - [mypy-manim.mobject.text.tex_mobject] ignore_errors = True