f-strings evaluate embedded expressions at runtime; .format is positional; Template is safe substitution. f-strings are the default for code (clean syntax, fast), but escape variables meant for end-users with Template to avoid template injection.
f"User {user.name} logged in at {datetime.now():%H:%M}" - fast, readable.
Template(“Hello $user”).substitute(user=“Bob”) - safe for end-user-controlled input.
.format(“{} {}”, a, b) - still useful for i18n message catalogs.
Avoid %-formatting; legacy and ambiguous.
f"..." -> default for code
Template -> safe for user input
.format -> i18n catalogs
f-string default. Template when input is end-user. .format when i18n messages.