Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions mypy/checkexpr.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from mypy.checker_shared import ExpressionCheckerSharedApi
from mypy.checkmember import analyze_member_access, has_operator
from mypy.checkstrformat import StringFormatterChecker
from mypy.constant_fold import constant_fold_expr
from mypy.erasetype import erase_type, remove_instance_last_known_values, replace_meta_vars
from mypy.errors import ErrorInfo, ErrorWatcher, report_internal_error
from mypy.expandtype import (
Expand Down Expand Up @@ -656,11 +657,12 @@ def visit_call_expr_inner(self, e: CallExpr, allow_none_return: bool = False) ->
return ret_type

def check_str_format_call(self, e: CallExpr) -> None:
"""More precise type checking for str.format() calls on literals."""
"""More precise type checking for str.format() calls on literals and folded constants."""
assert isinstance(e.callee, MemberExpr)
format_value = None
if isinstance(e.callee.expr, StrExpr):
format_value = e.callee.expr.value
folded_callee_expr = constant_fold_expr(e.callee.expr, "<unused>")
if isinstance(folded_callee_expr, str):
format_value = folded_callee_expr
elif self.chk.has_type(e.callee.expr):
typ = get_proper_type(self.chk.lookup_type(e.callee.expr))
if (
Expand Down