Skip to content

CLN: standardize string repr to use __repr__ #26521

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

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
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
23 changes: 10 additions & 13 deletions pandas/core/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,31 +34,28 @@

class StringMixin:
"""
Implements string methods so long as object defines a `__str__` method.
Require that an object defines a `__repr__` method.
"""
# side note - this could be made into a metaclass if more than one
# object needs
# TODO: Remove this class from the code base. It's not needed after
# dropping python2.

# ----------------------------------------------------------------------
# Formatting

def __str__(self):
def __repr__(self):
"""
Return a string representation for a particular Object
"""
raise AbstractMethodError(self)

def __repr__(self):
"""
Return a string representation for a particular object.
"""
return str(self)


class PandasObject(DirNamesMixin):

"""baseclass for various pandas objects"""

subclasses = []

def __init_subclass__(cls, **kwargs):
if hasattr(cls, '_cache'):
PandasObject.subclasses.append(cls)

@property
def _constructor(self):
"""class constructor (for this class it's just `__class__`"""
Expand Down
12 changes: 5 additions & 7 deletions pandas/core/computation/ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def __init__(self, name, env, side=None, encoding=None):
def local_name(self):
return self.name.replace(_LOCAL_TAG, '')

def __str__(self):
def __repr__(self):
return pprint_thing(self.name)

def __call__(self, *args, **kwargs):
Expand Down Expand Up @@ -166,9 +166,7 @@ def _resolve_name(self):
def name(self):
return self.value

def __str__(self):
# in python 2 str() of float
# can truncate shorter than repr()
def __repr__(self):
return repr(self.name)


Expand All @@ -188,7 +186,7 @@ def __init__(self, op, operands, *args, **kwargs):
def __iter__(self):
return iter(self.operands)

def __str__(self):
def __repr__(self):
"""Print a generic n-ary operator and its operands using infix
notation"""
# recurse over the operands
Expand Down Expand Up @@ -506,7 +504,7 @@ def __call__(self, env):
operand = self.operand(env)
return self.func(operand)

def __str__(self):
def __repr__(self):
return pprint_thing('{0}({1})'.format(self.op, self.operand))

@property
Expand All @@ -531,7 +529,7 @@ def __call__(self, env):
with np.errstate(all='ignore'):
return self.func.func(*operands)

def __str__(self):
def __repr__(self):
operands = map(str, self.operands)
return pprint_thing('{0}({1})'.format(self.op, ','.join(operands)))

Expand Down
10 changes: 4 additions & 6 deletions pandas/core/computation/pytables.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from pandas.core.dtypes.common import is_list_like

import pandas as pd
from pandas.core.base import StringMixin
import pandas.core.common as com
from pandas.core.computation import expr, ops
from pandas.core.computation.common import _ensure_decoded
Expand All @@ -36,8 +35,7 @@ class Term(ops.Term):

def __new__(cls, name, env, side=None, encoding=None):
klass = Constant if not isinstance(name, str) else cls
supr_new = StringMixin.__new__
return supr_new(klass)
return object.__new__(klass)

def __init__(self, name, env, side=None, encoding=None):
super().__init__(name, env, side=side, encoding=encoding)
Expand Down Expand Up @@ -230,7 +228,7 @@ def convert_values(self):

class FilterBinOp(BinOp):

def __str__(self):
def __repr__(self):
return pprint_thing("[Filter : [{lhs}] -> [{op}]"
.format(lhs=self.filter[0], op=self.filter[1]))

Expand Down Expand Up @@ -302,7 +300,7 @@ def evaluate(self):

class ConditionBinOp(BinOp):

def __str__(self):
def __repr__(self):
return pprint_thing("[Condition : [{cond}]]"
.format(cond=self.condition))

Expand Down Expand Up @@ -549,7 +547,7 @@ def __init__(self, where, queryables=None, encoding=None, scope_level=0):
encoding=encoding)
self.terms = self.parse()

def __str__(self):
def __repr__(self):
if self.terms is not None:
return pprint_thing(self.terms)
return pprint_thing(self.expr)
Expand Down
13 changes: 6 additions & 7 deletions pandas/core/computation/scope.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,7 @@ def _get_pretty_string(obj):
return sio.getvalue()


class Scope(StringMixin):

class Scope:
"""Object to hold scope, with a few bells to deal with some custom syntax
and contexts added by pandas.

Expand Down Expand Up @@ -135,13 +134,13 @@ def __init__(self, level, global_dict=None, local_dict=None, resolvers=(),
self.resolvers = DeepChainMap(*resolvers)
self.temps = {}

def __str__(self):
def __repr__(self):
scope_keys = _get_pretty_string(list(self.scope.keys()))
res_keys = _get_pretty_string(list(self.resolvers.keys()))
unicode_str = '{name}(scope={scope_keys}, resolvers={res_keys})'
return unicode_str.format(name=type(self).__name__,
scope_keys=scope_keys,
res_keys=res_keys)
template = '{name}(scope={scope_keys}, resolvers={res_keys})'
return template.format(name=type(self).__name__,
scope_keys=scope_keys,
res_keys=res_keys)

@property
def has_resolvers(self):
Expand Down
17 changes: 7 additions & 10 deletions pandas/io/pytables.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,6 @@ def _is_metadata_of(group, parent_group):


class HDFStore(StringMixin):

"""
Dict-like IO interface for storing pandas objects in PyTables
either Fixed or Table format.
Expand Down Expand Up @@ -520,7 +519,7 @@ def __contains__(self, key):
def __len__(self):
return len(self.groups())

def __str__(self):
def __repr__(self):
return '{type}\nFile path: {path}\n'.format(
type=type(self), path=pprint_thing(self._path))

Expand Down Expand Up @@ -1519,8 +1518,7 @@ def get_result(self, coordinates=False):
return results


class IndexCol(StringMixin):

class IndexCol:
""" an index column description class

Parameters
Expand Down Expand Up @@ -1587,7 +1585,7 @@ def set_table(self, table):
self.table = table
return self

def __str__(self):
def __repr__(self):
temp = tuple(
map(pprint_thing,
(self.name,
Expand Down Expand Up @@ -1881,7 +1879,7 @@ def __init__(self, values=None, kind=None, typ=None,
self.set_data(data)
self.set_metadata(metadata)

def __str__(self):
def __repr__(self):
temp = tuple(
map(pprint_thing,
(self.name,
Expand Down Expand Up @@ -2286,8 +2284,7 @@ def get_attr(self):
pass


class Fixed(StringMixin):

class Fixed:
""" represent an object in my store
facilitate read/write of various types of objects
this is an abstract base class
Expand Down Expand Up @@ -2336,7 +2333,7 @@ def pandas_type(self):
def format_type(self):
return 'fixed'

def __str__(self):
def __repr__(self):
""" return a pretty representation of myself """
self.infer_axes()
s = self.shape
Expand Down Expand Up @@ -3077,7 +3074,7 @@ def table_type_short(self):
def format_type(self):
return 'table'

def __str__(self):
def __repr__(self):
""" return a pretty representatgion of myself """
self.infer_axes()
dc = ",dc->[{columns}]".format(columns=(','.join(
Expand Down
2 changes: 1 addition & 1 deletion pandas/io/stata.py
Original file line number Diff line number Diff line change
Expand Up @@ -712,7 +712,7 @@ def generate_value_label(self, byteorder, encoding):
return bio.read()


class StataMissingValue(StringMixin):
class StataMissingValue:
"""
An observation's missing value.

Expand Down