Skip to content

Commit 4373a82

Browse files
alimcmaster1proost
authored andcommitted
CLN: String formatting % -> f-strings (pandas-dev#29518)
1 parent fdb56d6 commit 4373a82

21 files changed

+70
-79
lines changed

Diff for: pandas/core/arrays/period.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,7 @@ def _format_native_types(self, na_rep="NaT", date_format=None, **kwargs):
596596
if date_format:
597597
formatter = lambda dt: dt.strftime(date_format)
598598
else:
599-
formatter = lambda dt: "%s" % dt
599+
formatter = lambda dt: str(dt)
600600

601601
if self._hasnans:
602602
mask = self._isnan

Diff for: pandas/core/common.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ def pipe(obj, func, *args, **kwargs):
451451
if isinstance(func, tuple):
452452
func, target = func
453453
if target in kwargs:
454-
msg = "%s is both the pipe target and a keyword argument" % target
454+
msg = f"{target} is both the pipe target and a keyword argument"
455455
raise ValueError(msg)
456456
kwargs[target] = obj
457457
return func(*args, **kwargs)

Diff for: pandas/core/frame.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -1805,7 +1805,7 @@ def to_records(
18051805
if isinstance(self.index, ABCMultiIndex):
18061806
for i, n in enumerate(index_names):
18071807
if n is None:
1808-
index_names[i] = "level_%d" % count
1808+
index_names[i] = f"level_{count}"
18091809
count += 1
18101810
elif index_names[0] is None:
18111811
index_names = ["index"]
@@ -2454,7 +2454,7 @@ def info(
24542454
exceeds_info_cols = len(self.columns) > max_cols
24552455

24562456
def _verbose_repr():
2457-
lines.append("Data columns (total %d columns):" % len(self.columns))
2457+
lines.append(f"Data columns (total {len(self.columns)} columns):")
24582458
space = max(len(pprint_thing(k)) for k in self.columns) + 4
24592459
counts = None
24602460

@@ -2846,7 +2846,7 @@ def _getitem_bool_array(self, key):
28462846
)
28472847
elif len(key) != len(self.index):
28482848
raise ValueError(
2849-
"Item wrong length %d instead of %d." % (len(key), len(self.index))
2849+
f"Item wrong length {len(key)} instead of {len(self.index)}."
28502850
)
28512851

28522852
# check_bool_indexer will throw exception if Series key cannot
@@ -2957,7 +2957,7 @@ def _setitem_array(self, key, value):
29572957
if com.is_bool_indexer(key):
29582958
if len(key) != len(self.index):
29592959
raise ValueError(
2960-
"Item wrong length %d instead of %d!" % (len(key), len(self.index))
2960+
f"Item wrong length {len(key)} instead of {len(self.index)}!"
29612961
)
29622962
key = check_bool_indexer(self.index, key)
29632963
indexer = key.nonzero()[0]
@@ -4537,8 +4537,8 @@ def _maybe_casted_values(index, labels=None):
45374537
if not drop:
45384538
if isinstance(self.index, ABCMultiIndex):
45394539
names = [
4540-
n if n is not None else ("level_%d" % i)
4541-
for (i, n) in enumerate(self.index.names)
4540+
(n if n is not None else f"level_{i}")
4541+
for i, n in enumerate(self.index.names)
45424542
]
45434543
to_insert = zip(self.index.levels, self.index.codes)
45444544
else:
@@ -4858,8 +4858,7 @@ def sort_values(
48584858
by = [by]
48594859
if is_sequence(ascending) and len(by) != len(ascending):
48604860
raise ValueError(
4861-
"Length of ascending (%d) != length of by (%d)"
4862-
% (len(ascending), len(by))
4861+
f"Length of ascending ({len(ascending)}) != length of by ({len(by)})"
48634862
)
48644863
if len(by) > 1:
48654864
from pandas.core.sorting import lexsort_indexer

Diff for: pandas/core/generic.py

+13-15
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,7 @@ def _construct_axes_from_arguments(
421421
if a in kwargs:
422422
if alias in kwargs:
423423
raise TypeError(
424-
"arguments are mutually exclusive "
425-
"for [%s,%s]" % (a, alias)
424+
f"arguments are mutually exclusive for [{a},{alias}]"
426425
)
427426
continue
428427
if alias in kwargs:
@@ -754,7 +753,7 @@ def transpose(self, *args, **kwargs):
754753

755754
# we must have unique axes
756755
if len(axes) != len(set(axes)):
757-
raise ValueError("Must specify %s unique axes" % self._AXIS_LEN)
756+
raise ValueError(f"Must specify {self._AXIS_LEN} unique axes")
758757

759758
new_axes = self._construct_axes_dict_from(
760759
self, [self._get_axis(x) for x in axes_names]
@@ -2096,7 +2095,7 @@ def __repr__(self) -> str:
20962095
# string representation based upon iterating over self
20972096
# (since, by definition, `PandasContainers` are iterable)
20982097
prepr = "[%s]" % ",".join(map(pprint_thing, self))
2099-
return "%s(%s)" % (self.__class__.__name__, prepr)
2098+
return f"{self.__class__.__name__}({prepr})"
21002099

21012100
def _repr_latex_(self):
21022101
"""
@@ -6357,7 +6356,7 @@ def fillna(
63576356
elif isinstance(value, ABCDataFrame) and self.ndim == 2:
63586357
new_data = self.where(self.notna(), value)
63596358
else:
6360-
raise ValueError("invalid fill value with a %s" % type(value))
6359+
raise ValueError(f"invalid fill value with a {type(value)}")
63616360

63626361
if inplace:
63636362
self._update_inplace(new_data)
@@ -6794,9 +6793,8 @@ def replace(
67946793
if is_list_like(value):
67956794
if len(to_replace) != len(value):
67966795
raise ValueError(
6797-
"Replacement lists must match "
6798-
"in length. Expecting %d got %d "
6799-
% (len(to_replace), len(value))
6796+
f"Replacement lists must match in length. "
6797+
f"Expecting {len(to_replace)} got {len(value)} "
68006798
)
68016799

68026800
new_data = self._data.replace_list(
@@ -8871,7 +8869,7 @@ def align(
88718869
fill_axis=fill_axis,
88728870
)
88738871
else: # pragma: no cover
8874-
raise TypeError("unsupported type: %s" % type(other))
8872+
raise TypeError(f"unsupported type: {type(other)}")
88758873

88768874
def _align_frame(
88778875
self,
@@ -9515,9 +9513,9 @@ def tshift(self, periods=1, freq=None, axis=0):
95159513
new_data = self._data.copy()
95169514
new_data.axes[block_axis] = index.shift(periods)
95179515
else:
9518-
msg = "Given freq %s does not match PeriodIndex freq %s" % (
9519-
freq.rule_code,
9520-
orig_freq.rule_code,
9516+
msg = (
9517+
f"Given freq {freq.rule_code} does not match"
9518+
f" PeriodIndex freq {orig_freq.rule_code}"
95219519
)
95229520
raise ValueError(msg)
95239521
else:
@@ -9665,7 +9663,7 @@ def truncate(self, before=None, after=None, axis=None, copy=True):
96659663

96669664
if before is not None and after is not None:
96679665
if before > after:
9668-
raise ValueError("Truncate: %s must be after %s" % (after, before))
9666+
raise ValueError(f"Truncate: {after} must be after {before}")
96699667

96709668
slicer = [slice(None, None)] * self._AXIS_LEN
96719669
slicer[axis] = slice(before, after)
@@ -9711,7 +9709,7 @@ def _tz_convert(ax, tz):
97119709
if len(ax) > 0:
97129710
ax_name = self._get_axis_name(axis)
97139711
raise TypeError(
9714-
"%s is not a valid DatetimeIndex or PeriodIndex" % ax_name
9712+
f"{ax_name} is not a valid DatetimeIndex or PeriodIndex"
97159713
)
97169714
else:
97179715
ax = DatetimeIndex([], tz=tz)
@@ -9875,7 +9873,7 @@ def _tz_localize(ax, tz, ambiguous, nonexistent):
98759873
if len(ax) > 0:
98769874
ax_name = self._get_axis_name(axis)
98779875
raise TypeError(
9878-
"%s is not a valid DatetimeIndex or PeriodIndex" % ax_name
9876+
f"{ax_name} is not a valid DatetimeIndex or PeriodIndex"
98799877
)
98809878
else:
98819879
ax = DatetimeIndex([], tz=tz)

Diff for: pandas/core/indexes/base.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -963,14 +963,14 @@ def __repr__(self):
963963
data = self._format_data()
964964
attrs = self._format_attrs()
965965
space = self._format_space()
966-
967-
prepr = (",%s" % space).join("%s=%s" % (k, v) for k, v in attrs)
966+
attrs_str = [f"{k}={v}" for k, v in attrs]
967+
prepr = f",{space}".join(attrs_str)
968968

969969
# no data provided, just attributes
970970
if data is None:
971971
data = ""
972972

973-
res = "%s(%s%s)" % (klass, data, prepr)
973+
res = f"{klass}({data}{prepr})"
974974

975975
return res
976976

@@ -1124,13 +1124,13 @@ def _summary(self, name=None):
11241124
tail = self[-1]
11251125
if hasattr(tail, "format") and not isinstance(tail, str):
11261126
tail = tail.format()
1127-
index_summary = ", %s to %s" % (pprint_thing(head), pprint_thing(tail))
1127+
index_summary = f", {head} to {tail}"
11281128
else:
11291129
index_summary = ""
11301130

11311131
if name is None:
11321132
name = type(self).__name__
1133-
return "%s: %s entries%s" % (name, len(self), index_summary)
1133+
return f"{name}: {len(self)} entries{index_summary}"
11341134

11351135
def summary(self, name=None):
11361136
"""
@@ -1304,7 +1304,7 @@ def _set_names(self, values, level=None):
13041304
if not is_list_like(values):
13051305
raise ValueError("Names must be a list-like")
13061306
if len(values) != 1:
1307-
raise ValueError("Length of new names must be 1, got %d" % len(values))
1307+
raise ValueError(f"Length of new names must be 1, got {len(values)}")
13081308

13091309
# GH 20527
13101310
# All items in 'name' need to be hashable:
@@ -1475,8 +1475,8 @@ def _validate_index_level(self, level):
14751475
if isinstance(level, int):
14761476
if level < 0 and level != -1:
14771477
raise IndexError(
1478-
"Too many levels: Index has only 1 level,"
1479-
" %d is not a valid level number" % (level,)
1478+
f"Too many levels: Index has only 1 level,"
1479+
f" {level} is not a valid level number"
14801480
)
14811481
elif level > 0:
14821482
raise IndexError(
@@ -4540,7 +4540,7 @@ def shift(self, periods=1, freq=None):
45404540
'2012-03-01'],
45414541
dtype='datetime64[ns]', freq='MS')
45424542
"""
4543-
raise NotImplementedError("Not supported for type %s" % type(self).__name__)
4543+
raise NotImplementedError(f"Not supported for type {type(self).__name__}")
45444544

45454545
def argsort(self, *args, **kwargs):
45464546
"""
@@ -5047,8 +5047,8 @@ def get_slice_bound(self, label, side, kind):
50475047

50485048
if side not in ("left", "right"):
50495049
raise ValueError(
5050-
"Invalid value for side kwarg,"
5051-
" must be either 'left' or 'right': %s" % (side,)
5050+
f"Invalid value for side kwarg, must be either"
5051+
f" 'left' or 'right': {side}"
50525052
)
50535053

50545054
original_label = label
@@ -5602,7 +5602,7 @@ def _trim_front(strings):
56025602

56035603
def _validate_join_method(method):
56045604
if method not in ["left", "right", "inner", "outer"]:
5605-
raise ValueError("do not recognize join method %s" % method)
5605+
raise ValueError(f"do not recognize join method {method}")
56065606

56075607

56085608
def default_index(n):

Diff for: pandas/core/indexes/category.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ def _format_attrs(self):
357357
]
358358
if self.name is not None:
359359
attrs.append(("name", ibase.default_pprint(self.name)))
360-
attrs.append(("dtype", "'%s'" % self.dtype.name))
360+
attrs.append(("dtype", f"'{self.dtype.name}'"))
361361
max_seq_items = get_option("display.max_seq_items") or len(self)
362362
if len(self) > max_seq_items:
363363
attrs.append(("length", len(self)))

Diff for: pandas/core/indexes/datetimelike.py

+3-8
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
from pandas.core.indexes.base import Index, _index_shared_docs
3737
from pandas.core.tools.timedeltas import to_timedelta
3838

39-
import pandas.io.formats.printing as printing
4039
from pandas.tseries.frequencies import to_offset
4140

4241
_index_doc_kwargs = dict(ibase._index_doc_kwargs)
@@ -496,7 +495,7 @@ def _format_attrs(self):
496495
if attrib == "freq":
497496
freq = self.freqstr
498497
if freq is not None:
499-
freq = "'%s'" % freq
498+
freq = f"{freq!r}"
500499
attrs.append(("freq", freq))
501500
return attrs
502501

@@ -686,17 +685,13 @@ def _summary(self, name=None):
686685
"""
687686
formatter = self._formatter_func
688687
if len(self) > 0:
689-
index_summary = ", %s to %s" % (formatter(self[0]), formatter(self[-1]))
688+
index_summary = f", {formatter(self[0])} to {formatter(self[-1])}"
690689
else:
691690
index_summary = ""
692691

693692
if name is None:
694693
name = type(self).__name__
695-
result = "%s: %s entries%s" % (
696-
printing.pprint_thing(name),
697-
len(self),
698-
index_summary,
699-
)
694+
result = f"{name}: {len(self)} entries{index_summary}"
700695
if self.freq:
701696
result += "\nFreq: %s" % self.freqstr
702697

Diff for: pandas/core/indexes/datetimes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ def _formatter_func(self):
491491
from pandas.io.formats.format import _get_format_datetime64
492492

493493
formatter = _get_format_datetime64(is_dates_only=self._is_dates_only)
494-
return lambda x: "'%s'" % formatter(x, tz=self.tz)
494+
return lambda x: f"'{formatter(x, tz=self.tz)}'"
495495

496496
# --------------------------------------------------------------------
497497
# Set Operation Methods

Diff for: pandas/core/indexes/frozen.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def __str__(self) -> str:
109109
return pprint_thing(self, quote_strings=True, escape_chars=("\t", "\r", "\n"))
110110

111111
def __repr__(self) -> str:
112-
return "%s(%s)" % (self.__class__.__name__, str(self))
112+
return f"{self.__class__.__name__}({str(self)})"
113113

114114
__setitem__ = __setslice__ = __delitem__ = __delslice__ = _disabled
115115
pop = append = extend = remove = sort = insert = _disabled
@@ -153,7 +153,7 @@ def __repr__(self) -> str:
153153
Return a string representation for this object.
154154
"""
155155
prepr = pprint_thing(self, escape_chars=("\t", "\r", "\n"), quote_strings=True)
156-
return "%s(%s, dtype='%s')" % (type(self).__name__, prepr, self.dtype)
156+
return f"{type(self).__name__}({prepr}, dtype='{self.dtype}')"
157157

158158
@deprecate_kwarg(old_arg_name="v", new_arg_name="value")
159159
def searchsorted(self, value, side="left", sorter=None):

Diff for: pandas/core/indexes/multi.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -1329,21 +1329,20 @@ def _get_level_number(self, level) -> int:
13291329
count = self.names.count(level)
13301330
if (count > 1) and not is_integer(level):
13311331
raise ValueError(
1332-
"The name %s occurs multiple times, use a level number" % level
1332+
f"The name {level} occurs multiple times, use a level number"
13331333
)
13341334
try:
13351335
level = self.names.index(level)
13361336
except ValueError:
13371337
if not is_integer(level):
1338-
raise KeyError("Level %s not found" % str(level))
1338+
raise KeyError(f"Level {level} not found")
13391339
elif level < 0:
13401340
level += self.nlevels
13411341
if level < 0:
13421342
orig_level = level - self.nlevels
13431343
raise IndexError(
1344-
"Too many levels: Index has only %d "
1345-
"levels, %d is not a valid level number"
1346-
% (self.nlevels, orig_level)
1344+
f"Too many levels: Index has only {self.nlevels} levels,"
1345+
f" {orig_level} is not a valid level number"
13471346
)
13481347
# Note: levels are zero-based
13491348
elif level >= self.nlevels:
@@ -2286,8 +2285,8 @@ def reorder_levels(self, order):
22862285
order = [self._get_level_number(i) for i in order]
22872286
if len(order) != self.nlevels:
22882287
raise AssertionError(
2289-
"Length of order must be same as "
2290-
"number of levels (%d), got %d" % (self.nlevels, len(order))
2288+
f"Length of order must be same as number of levels ({self.nlevels}),"
2289+
f" got {len(order)}"
22912290
)
22922291
new_levels = [self.levels[i] for i in order]
22932292
new_codes = [self.codes[i] for i in order]
@@ -2599,8 +2598,8 @@ def slice_locs(self, start=None, end=None, step=None, kind=None):
25992598
def _partial_tup_index(self, tup, side="left"):
26002599
if len(tup) > self.lexsort_depth:
26012600
raise UnsortedIndexError(
2602-
"Key length (%d) was greater than MultiIndex"
2603-
" lexsort depth (%d)" % (len(tup), self.lexsort_depth)
2601+
f"Key length ({len(tup)}) was greater than MultiIndex lexsort depth"
2602+
f" ({self.lexsort_depth})"
26042603
)
26052604

26062605
n = len(tup)
@@ -2611,7 +2610,7 @@ def _partial_tup_index(self, tup, side="left"):
26112610

26122611
if lab not in lev:
26132612
if not lev.is_type_compatible(lib.infer_dtype([lab], skipna=False)):
2614-
raise TypeError("Level type mismatch: %s" % lab)
2613+
raise TypeError(f"Level type mismatch: {lab}")
26152614

26162615
# short circuit
26172616
loc = lev.searchsorted(lab, side=side)

0 commit comments

Comments
 (0)