python-pandas/cd2d804b80a9fa5aa9302d75cd927603ab80a7f0.patch
2019-09-13 04:21:17 -04:00

130 lines
4.9 KiB
Diff

From cd2d804b80a9fa5aa9302d75cd927603ab80a7f0 Mon Sep 17 00:00:00 2001
From: MeeseeksMachine <39504233+meeseeksmachine@users.noreply.github.com>
Date: Mon, 26 Aug 2019 10:09:25 -0700
Subject: [PATCH] Backport PR #28101: COMPAT: implement visit_Constant for 3.8
compat (#28146)
---
pandas/compat/__init__.py | 1 +
pandas/core/computation/expr.py | 3 +++
pandas/tests/computation/test_eval.py | 27 +++++++++++++++++++++++++--
pandas/tests/io/parser/test_common.py | 5 ++++-
pandas/tests/scalar/test_nat.py | 3 +++
6 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py
index b32da8da3a1..9c778f68727 100644
--- a/pandas/compat/__init__.py
+++ b/pandas/compat/__init__.py
@@ -15,6 +15,7 @@
PY35 = sys.version_info[:2] == (3, 5)
PY36 = sys.version_info >= (3, 6)
PY37 = sys.version_info >= (3, 7)
+PY38 = sys.version_info >= (3, 8)
PYPY = platform.python_implementation() == "PyPy"
diff --git a/pandas/core/computation/expr.py b/pandas/core/computation/expr.py
index 772fb547567..64bafbc694f 100644
--- a/pandas/core/computation/expr.py
+++ b/pandas/core/computation/expr.py
@@ -582,6 +582,9 @@ def visit_NameConstant(self, node, **kwargs):
def visit_Num(self, node, **kwargs):
return self.const_type(node.n, self.env)
+ def visit_Constant(self, node, **kwargs):
+ return self.const_type(node.n, self.env)
+
def visit_Str(self, node, **kwargs):
name = self.env.add_tmp(node.s)
return self.term_type(name, self.env)
diff --git a/pandas/tests/computation/test_eval.py b/pandas/tests/computation/test_eval.py
index c500760fa13..b6ffd8a83e4 100644
--- a/pandas/tests/computation/test_eval.py
+++ b/pandas/tests/computation/test_eval.py
@@ -14,7 +14,7 @@
from pandas.core.dtypes.common import is_bool, is_list_like, is_scalar
import pandas as pd
-from pandas import DataFrame, Series, date_range
+from pandas import DataFrame, Series, compat, date_range
from pandas.core.computation import pytables
from pandas.core.computation.check import _NUMEXPR_VERSION
from pandas.core.computation.engines import NumExprClobberingError, _engines
@@ -1267,7 +1267,10 @@ def test_assignment_column(self):
msg = "left hand side of an assignment must be a single name"
with pytest.raises(SyntaxError, match=msg):
df.eval("d,c = a + b")
- msg = "can't assign to function call"
+ if compat.PY38:
+ msg = "cannot assign to function call"
+ else:
+ msg = "can't assign to function call"
with pytest.raises(SyntaxError, match=msg):
df.eval('Timestamp("20131001") = a + b')
@@ -1967,6 +1970,26 @@ def test_bool_ops_fails_on_scalars(lhs, cmp, rhs, engine, parser):
pd.eval(ex, engine=engine, parser=parser)
+@pytest.mark.parametrize(
+ "other",
+ [
+ "'x'",
+ pytest.param(
+ "...", marks=pytest.mark.xfail(not compat.PY38, reason="GH-28116")
+ ),
+ ],
+)
+def test_equals_various(other):
+ df = DataFrame({"A": ["a", "b", "c"]})
+ result = df.eval("A == {}".format(other))
+ expected = Series([False, False, False], name="A")
+ if _USE_NUMEXPR:
+ # https://github.com/pandas-dev/pandas/issues/10239
+ # lose name with numexpr engine. Remove when that's fixed.
+ expected.name = None
+ tm.assert_series_equal(result, expected)
+
+
def test_inf(engine, parser):
s = "inf + 1"
expected = np.inf
diff --git a/pandas/tests/io/parser/test_common.py b/pandas/tests/io/parser/test_common.py
index b94d5cd497c..4a54d43de66 100644
--- a/pandas/tests/io/parser/test_common.py
+++ b/pandas/tests/io/parser/test_common.py
@@ -1898,7 +1898,10 @@ def test_null_byte_char(all_parsers):
out = parser.read_csv(StringIO(data), names=names)
tm.assert_frame_equal(out, expected)
else:
- msg = "NULL byte detected"
+ if compat.PY38:
+ msg = "line contains NUL"
+ else:
+ msg = "NULL byte detected"
with pytest.raises(ParserError, match=msg):
parser.read_csv(StringIO(data), names=names)
diff --git a/pandas/tests/scalar/test_nat.py b/pandas/tests/scalar/test_nat.py
index f935a7fa880..90ae6d5dab8 100644
--- a/pandas/tests/scalar/test_nat.py
+++ b/pandas/tests/scalar/test_nat.py
@@ -248,6 +248,7 @@ def _get_overlap_public_nat_methods(klass, as_tuple=False):
"day_name",
"dst",
"floor",
+ "fromisocalendar",
"fromisoformat",
"fromordinal",
"fromtimestamp",
@@ -292,6 +293,8 @@ def test_overlap_public_nat_methods(klass, expected):
# "fromisoformat" was introduced in 3.7
if klass is Timestamp and not compat.PY37:
expected.remove("fromisoformat")
+ if klass is Timestamp and not compat.PY38:
+ expected.remove("fromisocalendar")
assert _get_overlap_public_nat_methods(klass) == expected