Skip to content
Merged
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
24 changes: 0 additions & 24 deletions pandas/core/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,30 +46,6 @@
)


class StringMixin:
"""
Implements string methods so long as object defines a `__str__` method.
"""

# side note - this could be made into a metaclass if more than one
# object needs

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

def __str__(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"""
Expand Down
5 changes: 5 additions & 0 deletions pandas/core/computation/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,8 @@ def _remove_spaces_column_name(name):

class NameResolutionError(NameError):
pass


class StringMixin:
# TODO: delete this class. Removing this ATM caused a failure.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what does it cause to fail?

Is there a reason you are using "..." instead of "pass"?

Copy link
Contributor Author

@topper-123 topper-123 Aug 4, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, pass is more normal, I'll change that.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you remove the inheriance from StringMixin in core.computatons.scope.py::Scope tests will fail. Haven't been able to fix it.

pass
5 changes: 2 additions & 3 deletions pandas/core/computation/expr.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

import pandas as pd
from pandas.core import common as com
from pandas.core.base import StringMixin
from pandas.core.computation.common import (
_BACKTICK_QUOTED_STRING,
_remove_spaces_column_name,
Expand Down Expand Up @@ -799,7 +798,7 @@ def __init__(self, env, engine, parser, preparser=lambda x: x):
super().__init__(env, engine, parser, preparser=preparser)


class Expr(StringMixin):
class Expr:

"""Object encapsulating an expression.

Expand Down Expand Up @@ -831,7 +830,7 @@ def assigner(self):
def __call__(self):
return self.terms(self.env)

def __str__(self):
def __repr__(self):
return printing.pprint_thing(self.terms)

def __len__(self):
Expand Down
15 changes: 7 additions & 8 deletions pandas/core/computation/ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

from pandas.core.dtypes.common import is_list_like, is_scalar

from pandas.core.base import StringMixin
import pandas.core.common as com
from pandas.core.computation.common import _ensure_decoded, _result_type_many
from pandas.core.computation.scope import _DEFAULT_GLOBALS
Expand Down Expand Up @@ -63,7 +62,7 @@ def __init__(self, name, is_local):
super().__init__(msg.format(name))


class Term(StringMixin):
class Term:
def __new__(cls, name, env, side=None, encoding=None):
klass = Constant if not isinstance(name, str) else cls
supr_new = super(Term, klass).__new__
Expand All @@ -82,7 +81,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 @@ -182,7 +181,7 @@ def _resolve_name(self):
def name(self):
return self.value

def __str__(self):
def __repr__(self):
# in python 2 str() of float
# can truncate shorter than repr()
return repr(self.name)
Expand All @@ -191,7 +190,7 @@ def __str__(self):
_bool_op_map = {"not": "~", "and": "&", "or": "|"}


class Op(StringMixin):
class Op:

"""Hold an operator of arbitrary arity
"""
Expand All @@ -204,7 +203,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 @@ -537,7 +536,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 @@ -562,7 +561,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 @@ -32,8 +31,7 @@ def __init__(self, level, global_dict=None, local_dict=None, queryables=None):
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 @@ -231,7 +229,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 @@ -297,7 +295,7 @@ def evaluate(self):


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

def invert(self):
Expand Down Expand Up @@ -548,7 +546,7 @@ def __init__(self, where, queryables=None, encoding=None, scope_level=0):
)
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
4 changes: 2 additions & 2 deletions pandas/core/computation/scope.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
from pandas._libs.tslibs import Timestamp
from pandas.compat.chainmap import DeepChainMap

from pandas.core.base import StringMixin
import pandas.core.computation as compu
from pandas.core.computation.common import StringMixin


def _ensure_scope(
Expand Down Expand Up @@ -141,7 +141,7 @@ def __init__(
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})"
Expand Down
5 changes: 2 additions & 3 deletions pandas/tests/series/test_repr.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
period_range,
timedelta_range,
)
from pandas.core.base import StringMixin
from pandas.core.index import MultiIndex
import pandas.util.testing as tm

Expand Down Expand Up @@ -226,11 +225,11 @@ class TestCategoricalRepr:
def test_categorical_repr_unicode(self):
# see gh-21002

class County(StringMixin):
class County:
name = "San Sebastián"
state = "PR"

def __str__(self):
def __repr__(self):
return self.name + ", " + self.state

cat = pd.Categorical([County() for _ in range(61)])
Expand Down