From 017df982977e14733f6671a6f880dbe00f06c091 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 7 Feb 2026 23:23:56 +0100 Subject: [PATCH] refactor(fstring): make whole decimal spec optional --- src/core/format_spec/parser.py | 17 ++++++++++------- src/core/format_spec/spec.py | 3 ++- src/formatter.py | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/core/format_spec/parser.py b/src/core/format_spec/parser.py index 53e8f8a..1e4c732 100644 --- a/src/core/format_spec/parser.py +++ b/src/core/format_spec/parser.py @@ -86,7 +86,7 @@ class FormatSpecParser: def number(self) -> FormatSpecNumber: integral: FormatSpecIntegral = self.integral() - decimal: FormatSpecDecimal = self.decimal() + decimal: Optional[FormatSpecDecimal] = self.decimal() return FormatSpecNumber(integral=integral, decimal=decimal) def integral(self) -> FormatSpecIntegral: @@ -101,15 +101,18 @@ class FormatSpecParser: grouping=grouping ) - def decimal(self) -> FormatSpecDecimal: + def decimal(self) -> Optional[FormatSpecDecimal]: + if not self.match(TokenType.DOT): + return None + dot: Token = self.previous() precision: Optional[int] = None grouping: Optional[Token] = None - if self.match(TokenType.DOT): - if self.match(TokenType.NUMBER): - precision = self.previous().value - if self.match(TokenType.COMMA, TokenType.UNDERSCORE): - grouping = self.previous() + if self.match(TokenType.NUMBER): + precision = self.previous().value + if self.match(TokenType.COMMA, TokenType.UNDERSCORE): + grouping = self.previous() return FormatSpecDecimal( + dot=dot, precision=precision, grouping=grouping ) diff --git a/src/core/format_spec/spec.py b/src/core/format_spec/spec.py index da8a971..1a7f916 100644 --- a/src/core/format_spec/spec.py +++ b/src/core/format_spec/spec.py @@ -17,6 +17,7 @@ class FormatSpecIntegral: @dataclass(frozen=True) class FormatSpecDecimal: + dot: Token precision: Optional[int] grouping: Optional[Token] @@ -24,7 +25,7 @@ class FormatSpecDecimal: @dataclass(frozen=True) class FormatSpecNumber: integral: FormatSpecIntegral - decimal: FormatSpecDecimal + decimal: Optional[FormatSpecDecimal] @dataclass(frozen=True) diff --git a/src/formatter.py b/src/formatter.py index 7a4e30f..453d45d 100644 --- a/src/formatter.py +++ b/src/formatter.py @@ -200,7 +200,7 @@ class Formatter(Expr.Visitor[str], Stmt.Visitor[str]): res += str(spec.number.integral.width) if spec.number.integral.grouping is not None: res += spec.number.integral.grouping.lexeme - if spec.number.decimal.precision is not None or spec.number.decimal.grouping is not None: + if spec.number.decimal is not None: res += "." if spec.number.decimal.precision is not None: res += str(spec.number.decimal.precision)