Positional Formatting in Python
Positional formatting is a powerful and readable way to insert values into strings using numbered placeholders. It is widely used in data science for building log messages, SQL queries, report strings, feature names, and dynamic output. In 2026, understanding both the classic .format() method and modern f-strings with positional arguments is essential for writing clean, maintainable, and efficient text-generation code.
TL;DR — Positional Formatting Methods
"{} {}".format(value1, value2)→ classic positionalf"{value1} {value2}"→ modern f-string (positional by default)- Numbered placeholders
{0},{1}allow reordering - Very useful for logs, reports, and dynamic strings
1. Basic Positional Formatting
name = "Alice"
score = 95
model = "random_forest"
# Classic .format() with positional arguments
message = "User {} achieved score {} using {} model".format(name, score, model)
print(message)
# Modern f-string (positional by default)
message2 = f"User {name} achieved score {score} using {model} model"
print(message2)
2. Advanced Positional Formatting with Numbered Placeholders
# Reordering and reuse
template = "Model {1} achieved accuracy {0:.2f}% on dataset {2}"
result = template.format(98.76, "XGBoost", "customer_churn")
print(result)
# Same value in multiple places
report = "Score: {0:.2f} (model {1}) – Previous score: {0:.2f} (model {2})"
print(report.format(92.5, "Random Forest", "XGBoost"))
3. Real-World Data Science Examples
import pandas as pd
# Demo file so this example runs as-is (in your project this is your real results file)
pd.DataFrame({
"model_name": ["XGBoost", "RandomForest", "LogReg"],
"accuracy": [92.5, 89.123, 84.3],
"dataset": ["customer_churn", "fraud", "customer_churn"],
}).to_csv("model_results.csv", index=False)
df = pd.read_csv("model_results.csv")
# Example 1: Dynamic log message
for row in df.itertuples():
log = f"Model {row.model_name} achieved {row.accuracy:.2f}% accuracy on {row.dataset}"
print(log)
# Example 2: Building SQL queries safely
columns = ["customer_id", "order_date", "amount"]
query = "SELECT {} FROM sales WHERE amount > {}".format(", ".join(columns), 1000)
print(query)
4. Best Practices in 2026
- Use f-strings for simple, readable positional formatting
- Use numbered placeholders
{0},{1}when you need reordering or reuse - Prefer
.format()for complex templates or when you need to store the template separately - Always use f-strings or
.format()instead of old%formatting - Keep formatting logic separate from business logic for maintainability
How Positional Placeholders Are Matched
With str.format, empty braces {} take arguments in order: the first {} gets the first argument, the second {} the second, and so on. Numbered braces such as {0} and {1} refer to argument positions directly, so the same value can be used twice or in a different order.
You cannot mix the two styles in one string; Python raises ValueError if you combine {} with {0}. Too few arguments raise IndexError, while extra arguments are silently ignored, which can hide mistakes.
Positional formatting is still common in older code and in templates stored outside the program, so it is worth being able to read it.
Worked Example: Reusing and Reordering Arguments
Numbered placeholders repeat and reorder values.
row = ("Lahore", 2026, 1.5)
print("{} in {}: {}%".format(*row))
print("{1} report for {0} ({1})".format(row[0], row[1]))
try:
print("{} and {1}".format("a", "b"))
except ValueError as e:
print("ValueError:", e)
The first line fills braces in order, the second reuses the year twice, and the last line shows the error when automatic and manual numbering are mixed.
Practical Tips
In new code, prefer named placeholders or f-strings, which make the template self-explanatory. Keep positional formatting for short messages where the order is obvious, and for reading older code that already uses it.
When a template is reused in several places, store it in one constant so the order is defined once.
Common Mistakes
- Mixing {} and {0} in the same string.
- Passing too few arguments.
- Relying on order when names would be clearer.
- Forgetting that extra arguments are ignored silently.
Quick Summary
- {} fills arguments in order.
- {0} and {1} select positions.
- Numbers allow reuse and reordering.
- Do not mix numbering styles.
Conclusion
Positional formatting is a core string operation that every data scientist uses daily. In 2026, f-strings and the .format() method with positional arguments provide clean, efficient, and readable ways to build dynamic strings for logs, reports, queries, and feature generation. Mastering these techniques prepares you for more advanced Regular Expression work and makes your text processing code significantly more professional.
Next steps:
- Review your current string-building code and replace any manual concatenation with positional formatting using f-strings or
.format()