summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2018-05-15 10:54:33 -0600
committerGitHub <noreply@github.com>2018-05-15 10:54:33 -0600
commit5023c3b8decf91f435676e0e3767a3ca68eee316 (patch)
tree5697e212ce3173b77ec56adb51a2af73b41fb17a /numpy
parentb2a699a47952323673a33951d9a6d94aff209831 (diff)
parent7c796c3f06f06ccc92e9f83d7ecc51f797926e19 (diff)
downloadnumpy-5023c3b8decf91f435676e0e3767a3ca68eee316.tar.gz
Merge pull request #11091 from ahaldane/fix_py2_float_to_file
BUG: Python2 doubles don't print correctly in interactive shell
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/scalartypes.c.src2
-rw-r--r--numpy/core/tests/test_scalarprint.py38
2 files changed, 36 insertions, 4 deletions
diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src
index cb4af0d12..6dc7e5a3e 100644
--- a/numpy/core/src/multiarray/scalartypes.c.src
+++ b/numpy/core/src/multiarray/scalartypes.c.src
@@ -4201,7 +4201,7 @@ doubletype_print(PyObject *o, FILE *fp, int flags)
return -1;
}
- ret = PyObject_Print(to_print, fp, flags);
+ ret = PyObject_Print(to_print, fp, Py_PRINT_RAW);
Py_DECREF(to_print);
return ret;
}
diff --git a/numpy/core/tests/test_scalarprint.py b/numpy/core/tests/test_scalarprint.py
index 94d8294f1..a20ec9f74 100644
--- a/numpy/core/tests/test_scalarprint.py
+++ b/numpy/core/tests/test_scalarprint.py
@@ -4,9 +4,10 @@
"""
from __future__ import division, absolute_import, print_function
-import tempfile
+import code, sys
+from tempfile import TemporaryFile
import numpy as np
-from numpy.testing import assert_, assert_equal
+from numpy.testing import assert_, assert_equal, suppress_warnings
class TestRealScalars(object):
@@ -53,7 +54,7 @@ class TestRealScalars(object):
# output to a "real file" (ie, not a StringIO). Make sure we don't
# inherit it.
x = np.double(0.1999999999999)
- with tempfile.TemporaryFile('r+t') as f:
+ with TemporaryFile('r+t') as f:
print(x, file=f)
f.seek(0)
output = f.read()
@@ -62,6 +63,37 @@ class TestRealScalars(object):
# precision as '0.2', but we want numpy's np.double('0.1999999999999')
# to print the unique value, '0.1999999999999'.
+ # gh-11031
+ # Only in the python2 interactive shell and when stdout is a "real"
+ # file, the output of the last command is printed to stdout without
+ # Py_PRINT_RAW (unlike the print statement) so `>>> x` and `>>> print
+ # x` are potentially different. Make sure they are the same. The only
+ # way I found to get prompt-like output is using an actual prompt from
+ # the 'code' module. Again, must use tempfile to get a "real" file.
+
+ # dummy user-input which enters one line and then ctrl-Ds.
+ def userinput():
+ yield 'np.sqrt(2)'
+ raise EOFError
+ gen = userinput()
+ input_func = lambda prompt="": next(gen)
+
+ with TemporaryFile('r+t') as fo, TemporaryFile('r+t') as fe:
+ orig_stdout, orig_stderr = sys.stdout, sys.stderr
+ sys.stdout, sys.stderr = fo, fe
+
+ # py2 code.interact sends irrelevant internal DeprecationWarnings
+ with suppress_warnings() as sup:
+ sup.filter(DeprecationWarning)
+ code.interact(local={'np': np}, readfunc=input_func, banner='')
+
+ sys.stdout, sys.stderr = orig_stdout, orig_stderr
+
+ fo.seek(0)
+ capture = fo.read().strip()
+
+ assert_equal(capture, repr(np.sqrt(2)))
+
def test_dragon4(self):
# these tests are adapted from Ryan Juckett's dragon4 implementation,
# see dragon4.c for details.