Skip to content

CLN: String formatting % -> f-strings #29518

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Nov 18, 2019
2 changes: 1 addition & 1 deletion pandas/core/arrays/period.py
Original file line number Diff line number Diff line change
Expand Up @@ -596,7 +596,7 @@ def _format_native_types(self, na_rep="NaT", date_format=None, **kwargs):
if date_format:
formatter = lambda dt: dt.strftime(date_format)
else:
formatter = lambda dt: "%s" % dt
formatter = lambda dt: str(dt)

if self._hasnans:
mask = self._isnan
Expand Down
2 changes: 1 addition & 1 deletion pandas/core/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ def pipe(obj, func, *args, **kwargs):
if isinstance(func, tuple):
func, target = func
if target in kwargs:
msg = "%s is both the pipe target and a keyword argument" % target
msg = f"{target} is both the pipe target and a keyword argument"
raise ValueError(msg)
kwargs[target] = obj
return func(*args, **kwargs)
Expand Down
15 changes: 7 additions & 8 deletions pandas/core/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -1805,7 +1805,7 @@ def to_records(
if isinstance(self.index, ABCMultiIndex):
for i, n in enumerate(index_names):
if n is None:
index_names[i] = "level_%d" % count
index_names[i] = f"level_{count}"
count += 1
elif index_names[0] is None:
index_names = ["index"]
Expand Down Expand Up @@ -2454,7 +2454,7 @@ def info(
exceeds_info_cols = len(self.columns) > max_cols

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

Expand Down Expand Up @@ -2846,7 +2846,7 @@ def _getitem_bool_array(self, key):
)
elif len(key) != len(self.index):
raise ValueError(
"Item wrong length %d instead of %d." % (len(key), len(self.index))
f"Item wrong length {len(key)} instead of {len(self.index)}."
)

# check_bool_indexer will throw exception if Series key cannot
Expand Down Expand Up @@ -2957,7 +2957,7 @@ def _setitem_array(self, key, value):
if com.is_bool_indexer(key):
if len(key) != len(self.index):
raise ValueError(
"Item wrong length %d instead of %d!" % (len(key), len(self.index))
f"Item wrong length {len(key)} instead of {len(self.index)}!"
)
key = check_bool_indexer(self.index, key)
indexer = key.nonzero()[0]
Expand Down Expand Up @@ -4537,8 +4537,8 @@ def _maybe_casted_values(index, labels=None):
if not drop:
if isinstance(self.index, ABCMultiIndex):
names = [
n if n is not None else ("level_%d" % i)
for (i, n) in enumerate(self.index.names)
(n if n is not None else f"level_{i}")
for i, n in enumerate(self.index.names)
]
to_insert = zip(self.index.levels, self.index.codes)
else:
Expand Down Expand Up @@ -4858,8 +4858,7 @@ def sort_values(
by = [by]
if is_sequence(ascending) and len(by) != len(ascending):
raise ValueError(
"Length of ascending (%d) != length of by (%d)"
% (len(ascending), len(by))
f"Length of ascending ({len(ascending)}) != length of by ({len(by)})"
)
if len(by) > 1:
from pandas.core.sorting import lexsort_indexer
Expand Down
28 changes: 13 additions & 15 deletions pandas/core/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -421,8 +421,7 @@ def _construct_axes_from_arguments(
if a in kwargs:
if alias in kwargs:
raise TypeError(
"arguments are mutually exclusive "
"for [%s,%s]" % (a, alias)
f"arguments are mutually exclusive for [{a},{alias}]"
)
continue
if alias in kwargs:
Expand Down Expand Up @@ -754,7 +753,7 @@ def transpose(self, *args, **kwargs):

# we must have unique axes
if len(axes) != len(set(axes)):
raise ValueError("Must specify %s unique axes" % self._AXIS_LEN)
raise ValueError(f"Must specify {self._AXIS_LEN} unique axes")

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

def _repr_latex_(self):
"""
Expand Down Expand Up @@ -6357,7 +6356,7 @@ def fillna(
elif isinstance(value, ABCDataFrame) and self.ndim == 2:
new_data = self.where(self.notna(), value)
else:
raise ValueError("invalid fill value with a %s" % type(value))
raise ValueError(f"invalid fill value with a {type(value)}")

if inplace:
self._update_inplace(new_data)
Expand Down Expand Up @@ -6794,9 +6793,8 @@ def replace(
if is_list_like(value):
if len(to_replace) != len(value):
raise ValueError(
"Replacement lists must match "
"in length. Expecting %d got %d "
% (len(to_replace), len(value))
f"Replacement lists must match in length. "
f"Expecting {len(to_replace)} got {len(value)} "
)

new_data = self._data.replace_list(
Expand Down Expand Up @@ -8871,7 +8869,7 @@ def align(
fill_axis=fill_axis,
)
else: # pragma: no cover
raise TypeError("unsupported type: %s" % type(other))
raise TypeError(f"unsupported type: {type(other)}")

def _align_frame(
self,
Expand Down Expand Up @@ -9515,9 +9513,9 @@ def tshift(self, periods=1, freq=None, axis=0):
new_data = self._data.copy()
new_data.axes[block_axis] = index.shift(periods)
else:
msg = "Given freq %s does not match PeriodIndex freq %s" % (
freq.rule_code,
orig_freq.rule_code,
msg = (
f"Given freq {freq.rule_code} does not match"
f" PeriodIndex freq {orig_freq.rule_code}"
)
raise ValueError(msg)
else:
Expand Down Expand Up @@ -9665,7 +9663,7 @@ def truncate(self, before=None, after=None, axis=None, copy=True):

if before is not None and after is not None:
if before > after:
raise ValueError("Truncate: %s must be after %s" % (after, before))
raise ValueError(f"Truncate: {after} must be after {before}")

slicer = [slice(None, None)] * self._AXIS_LEN
slicer[axis] = slice(before, after)
Expand Down Expand Up @@ -9711,7 +9709,7 @@ def _tz_convert(ax, tz):
if len(ax) > 0:
ax_name = self._get_axis_name(axis)
raise TypeError(
"%s is not a valid DatetimeIndex or PeriodIndex" % ax_name
f"{ax_name} is not a valid DatetimeIndex or PeriodIndex"
)
else:
ax = DatetimeIndex([], tz=tz)
Expand Down Expand Up @@ -9875,7 +9873,7 @@ def _tz_localize(ax, tz, ambiguous, nonexistent):
if len(ax) > 0:
ax_name = self._get_axis_name(axis)
raise TypeError(
"%s is not a valid DatetimeIndex or PeriodIndex" % ax_name
f"{ax_name} is not a valid DatetimeIndex or PeriodIndex"
)
else:
ax = DatetimeIndex([], tz=tz)
Expand Down
24 changes: 12 additions & 12 deletions pandas/core/indexes/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -963,14 +963,14 @@ def __repr__(self):
data = self._format_data()
attrs = self._format_attrs()
space = self._format_space()

prepr = (",%s" % space).join("%s=%s" % (k, v) for k, v in attrs)
attrs_str = [f"{k}={v}" for k, v in attrs]
prepr = f",{space}".join(attrs_str)

# no data provided, just attributes
if data is None:
data = ""

res = "%s(%s%s)" % (klass, data, prepr)
res = f"{klass}({data}{prepr})"

return res

Expand Down Expand Up @@ -1124,13 +1124,13 @@ def _summary(self, name=None):
tail = self[-1]
if hasattr(tail, "format") and not isinstance(tail, str):
tail = tail.format()
index_summary = ", %s to %s" % (pprint_thing(head), pprint_thing(tail))
index_summary = f", {head} to {tail}"
else:
index_summary = ""

if name is None:
name = type(self).__name__
return "%s: %s entries%s" % (name, len(self), index_summary)
return f"{name}: {len(self)} entries{index_summary}"

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

# GH 20527
# All items in 'name' need to be hashable:
Expand Down Expand Up @@ -1475,8 +1475,8 @@ def _validate_index_level(self, level):
if isinstance(level, int):
if level < 0 and level != -1:
raise IndexError(
"Too many levels: Index has only 1 level,"
" %d is not a valid level number" % (level,)
f"Too many levels: Index has only 1 level,"
f" {level} is not a valid level number"
)
elif level > 0:
raise IndexError(
Expand Down Expand Up @@ -4565,7 +4565,7 @@ def shift(self, periods=1, freq=None):
'2012-03-01'],
dtype='datetime64[ns]', freq='MS')
"""
raise NotImplementedError("Not supported for type %s" % type(self).__name__)
raise NotImplementedError(f"Not supported for type {type(self).__name__}")

def argsort(self, *args, **kwargs):
"""
Expand Down Expand Up @@ -5072,8 +5072,8 @@ def get_slice_bound(self, label, side, kind):

if side not in ("left", "right"):
raise ValueError(
"Invalid value for side kwarg,"
" must be either 'left' or 'right': %s" % (side,)
f"Invalid value for side kwarg, must be either"
f" 'left' or 'right': {side}"
)

original_label = label
Expand Down Expand Up @@ -5627,7 +5627,7 @@ def _trim_front(strings):

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


def default_index(n):
Expand Down
2 changes: 1 addition & 1 deletion pandas/core/indexes/category.py
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ def _format_attrs(self):
]
if self.name is not None:
attrs.append(("name", ibase.default_pprint(self.name)))
attrs.append(("dtype", "'%s'" % self.dtype.name))
attrs.append(("dtype", f"'{self.dtype.name}'"))
max_seq_items = get_option("display.max_seq_items") or len(self)
if len(self) > max_seq_items:
attrs.append(("length", len(self)))
Expand Down
11 changes: 3 additions & 8 deletions pandas/core/indexes/datetimelike.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
from pandas.core.indexes.base import Index, _index_shared_docs
from pandas.core.tools.timedeltas import to_timedelta

import pandas.io.formats.printing as printing
from pandas.tseries.frequencies import to_offset

_index_doc_kwargs = dict(ibase._index_doc_kwargs)
Expand Down Expand Up @@ -496,7 +495,7 @@ def _format_attrs(self):
if attrib == "freq":
freq = self.freqstr
if freq is not None:
freq = "'%s'" % freq
freq = f"{freq!r}"
attrs.append(("freq", freq))
return attrs

Expand Down Expand Up @@ -686,17 +685,13 @@ def _summary(self, name=None):
"""
formatter = self._formatter_func
if len(self) > 0:
index_summary = ", %s to %s" % (formatter(self[0]), formatter(self[-1]))
index_summary = f", {formatter(self[0])} to {formatter(self[-1])}"
else:
index_summary = ""

if name is None:
name = type(self).__name__
result = "%s: %s entries%s" % (
printing.pprint_thing(name),
len(self),
index_summary,
)
result = f"{name}: {len(self)} entries{index_summary}"
if self.freq:
result += "\nFreq: %s" % self.freqstr

Expand Down
2 changes: 1 addition & 1 deletion pandas/core/indexes/datetimes.py
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ def _formatter_func(self):
from pandas.io.formats.format import _get_format_datetime64

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

# --------------------------------------------------------------------
# Set Operation Methods
Expand Down
4 changes: 2 additions & 2 deletions pandas/core/indexes/frozen.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def __str__(self) -> str:
return pprint_thing(self, quote_strings=True, escape_chars=("\t", "\r", "\n"))

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

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

@deprecate_kwarg(old_arg_name="v", new_arg_name="value")
def searchsorted(self, value, side="left", sorter=None):
Expand Down
19 changes: 9 additions & 10 deletions pandas/core/indexes/multi.py
Original file line number Diff line number Diff line change
Expand Up @@ -1329,21 +1329,20 @@ def _get_level_number(self, level) -> int:
count = self.names.count(level)
if (count > 1) and not is_integer(level):
raise ValueError(
"The name %s occurs multiple times, use a level number" % level
f"The name {level} occurs multiple times, use a level number"
)
try:
level = self.names.index(level)
except ValueError:
if not is_integer(level):
raise KeyError("Level %s not found" % str(level))
raise KeyError(f"Level {level} not found")
elif level < 0:
level += self.nlevels
if level < 0:
orig_level = level - self.nlevels
raise IndexError(
"Too many levels: Index has only %d "
"levels, %d is not a valid level number"
% (self.nlevels, orig_level)
f"Too many levels: Index has only {self.nlevels} levels,"
f" {orig_level} is not a valid level number"
)
# Note: levels are zero-based
elif level >= self.nlevels:
Expand Down Expand Up @@ -2286,8 +2285,8 @@ def reorder_levels(self, order):
order = [self._get_level_number(i) for i in order]
if len(order) != self.nlevels:
raise AssertionError(
"Length of order must be same as "
"number of levels (%d), got %d" % (self.nlevels, len(order))
f"Length of order must be same as number of levels ({self.nlevels}),"
f" got {len(order)}"
)
new_levels = [self.levels[i] for i in order]
new_codes = [self.codes[i] for i in order]
Expand Down Expand Up @@ -2599,8 +2598,8 @@ def slice_locs(self, start=None, end=None, step=None, kind=None):
def _partial_tup_index(self, tup, side="left"):
if len(tup) > self.lexsort_depth:
raise UnsortedIndexError(
"Key length (%d) was greater than MultiIndex"
" lexsort depth (%d)" % (len(tup), self.lexsort_depth)
f"Key length ({len(tup)}) was greater than MultiIndex lexsort depth"
f" ({self.lexsort_depth})"
)

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

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

# short circuit
loc = lev.searchsorted(lab, side=side)
Expand Down
Loading