summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/pydebug.h4
-rw-r--r--Lib/test/test_descr.py5
-rw-r--r--Lib/test/test_generators.py12
-rw-r--r--Lib/zipfile.py4
-rw-r--r--Misc/NEWS21
-rw-r--r--Modules/main.c5
-rw-r--r--Python/ceval.c25
-rw-r--r--Python/pythonrun.c4
8 files changed, 55 insertions, 25 deletions
diff --git a/Include/pydebug.h b/Include/pydebug.h
index 9ecd8a0..d92161c 100644
--- a/Include/pydebug.h
+++ b/Include/pydebug.h
@@ -16,6 +16,10 @@ extern DL_IMPORT(int) Py_TabcheckFlag;
extern DL_IMPORT(int) Py_UnicodeFlag;
extern DL_IMPORT(int) Py_IgnoreEnvironmentFlag;
extern DL_IMPORT(int) Py_DivisionWarningFlag;
+/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed,
+ on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
+ true divisions (which they will be in 2.3). */
+extern DL_IMPORT(int) _Py_QnewFlag;
/* this is a wrapper around getenv() that pays attention to
Py_IgnoreEnvironmentFlag. It should be used for getting variables like
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 481ca0f..a0958df 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -23,6 +23,11 @@ def testunop(a, res, expr="len(a)", meth="__len__"):
def testbinop(a, b, res, expr="a+b", meth="__add__"):
if verbose: print "checking", expr
dict = {'a': a, 'b': b}
+
+ # XXX Hack so this passes before 2.3 when -Qnew is specified.
+ if meth == "__div__" and 1/2 == 0.5:
+ meth = "__truediv__"
+
vereq(eval(expr, dict), res)
t = type(a)
m = getattr(t, meth)
diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py
index 118b1d9..2c319e5 100644
--- a/Lib/test/test_generators.py
+++ b/Lib/test/test_generators.py
@@ -182,7 +182,7 @@ Specification: Return
Specification: Generators and Exception Propagation
>>> def f():
- ... return 1/0
+ ... return 1//0
>>> def g():
... yield f() # the zero division exception propagates
... yield 42 # and we'll never get here
@@ -206,7 +206,7 @@ Specification: Try/Except/Finally
... yield 1
... try:
... yield 2
- ... 1/0
+ ... 1//0
... yield 3 # never get here
... except ZeroDivisionError:
... yield 4
@@ -253,7 +253,7 @@ Guido's binary tree example.
... n = len(list)
... if n == 0:
... return []
- ... i = n / 2
+ ... i = n // 2
... return Tree(list[i], tree(list[:i]), tree(list[i+1:]))
>>> # Show it off: create a tree.
@@ -691,7 +691,7 @@ SyntaxError: 'yield' not allowed in a 'try' block with a 'finally' clause (<stri
>>> def f():
... try:
... try:
-... 1/0
+... 1//0
... except ZeroDivisionError:
... yield 666 # bad because *outer* try has finally
... except:
@@ -708,7 +708,7 @@ But this is fine:
... try:
... try:
... yield 12
-... 1/0
+... 1//0
... except ZeroDivisionError:
... yield 666
... except:
@@ -751,7 +751,7 @@ SyntaxError: invalid syntax
... pass
... elif 0:
... try:
-... 1/0
+... 1//0
... except SyntaxError:
... pass
... else:
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 4b59ac6..0efcad3 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -117,7 +117,7 @@ class ZipInfo:
"""Return the per-file header as a string."""
dt = self.date_time
dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
- dostime = dt[3] << 11 | dt[4] << 5 | dt[5] / 2
+ dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
if self.flag_bits & 0x08:
# Set these to zero because we write them after the file data
CRC = compress_size = file_size = 0
@@ -468,7 +468,7 @@ class ZipFile:
count = count + 1
dt = zinfo.date_time
dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
- dostime = dt[3] << 11 | dt[4] << 5 | dt[5] / 2
+ dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
centdir = struct.pack(structCentralDir,
stringCentralDir, zinfo.create_version,
zinfo.create_system, zinfo.extract_version, zinfo.reserved,
diff --git a/Misc/NEWS b/Misc/NEWS
index eabe9b6..db38eca 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -39,6 +39,13 @@ Type/class unification and new-style classes
Core and builtins
+- -Qnew now works as documented in PEP 238: when -Qnew is passed on
+ the command line, all occurrences of "/" use true division instead
+ of classic division. See the PEP for details. Note that "all"
+ means all instances in library and 3rd-party modules, as well as in
+ your own code. As the PEP says, -Qnew is intended for use only in
+ educational environments with control over the libraries in use.
+
Extension modules
- gc.get_referents was renamed to gc.get_referrers.
@@ -712,11 +719,15 @@ Core
warnings are issued. Using -Qwarn issues a run-time warning about
all uses of classic division for int and long arguments; -Qwarnall
also warns about classic division for float and complex arguments
- (for use with fixdiv.py). Using -Qnew is questionable; it turns on
- new division by default, but only in the __main__ module. You can
- usefully combine -Qwarn or -Qwarnall and -Qnew: this gives the
- __main__ module new division, and warns about classic division
- everywhere else.
+ (for use with fixdiv.py).
+ [Note: the remainder of this paragraph (preserved below) became
+ obsolete in 2.2c1 -- -Qnew has global effect in 2.2]
+ <obsolete>
+ Using -Qnew is questionable; it turns on new division by default, but
+ only in the __main__ module. You can usefully combine -Qwarn or
+ -Qwarnall and -Qnew: this gives the __main__ module new division, and
+ warns about classic division everywhere else.
+ </obsolete>
- Many built-in types can now be subclassed. This applies to int,
long, float, str, unicode, and tuple. (The types complex, list and
diff --git a/Modules/main.c b/Modules/main.c
index eea848f..5f71ee2 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -169,8 +169,11 @@ Py_Main(int argc, char **argv)
break;
}
if (strcmp(_PyOS_optarg, "new") == 0) {
- /* XXX This only affects __main__ */
+ /* This only affects __main__ */
cf.cf_flags |= CO_FUTURE_DIVISION;
+ /* And this tells the eval loop to treat
+ BINARY_DIVIDE as BINARY_TRUE_DIVIDE */
+ _Py_QnewFlag = 1;
break;
}
fprintf(stderr,
diff --git a/Python/ceval.c b/Python/ceval.c
index 5358517..76424e1 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -903,9 +903,22 @@ eval_frame(PyFrameObject *f)
break;
case BINARY_DIVIDE:
+ if (!_Py_QnewFlag) {
+ w = POP();
+ v = POP();
+ x = PyNumber_Divide(v, w);
+ Py_DECREF(v);
+ Py_DECREF(w);
+ PUSH(x);
+ if (x != NULL) continue;
+ break;
+ }
+ /* -Qnew is in effect: fall through to
+ BINARY_TRUE_DIVIDE */
+ case BINARY_TRUE_DIVIDE:
w = POP();
v = POP();
- x = PyNumber_Divide(v, w);
+ x = PyNumber_TrueDivide(v, w);
Py_DECREF(v);
Py_DECREF(w);
PUSH(x);
@@ -922,16 +935,6 @@ eval_frame(PyFrameObject *f)
if (x != NULL) continue;
break;
- case BINARY_TRUE_DIVIDE:
- w = POP();
- v = POP();
- x = PyNumber_TrueDivide(v, w);
- Py_DECREF(v);
- Py_DECREF(w);
- PUSH(x);
- if (x != NULL) continue;
- break;
-
case BINARY_MODULO:
w = POP();
v = POP();
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 628058b..a8ad845 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -64,6 +64,10 @@ int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
int Py_FrozenFlag; /* Needed by getpath.c */
int Py_UnicodeFlag = 0; /* Needed by compile.c */
int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
+/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed,
+ on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
+ true divisions (which they will be in 2.3). */
+int _Py_QnewFlag = 0;
static int initialized = 0;