summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2008-05-20 08:40:43 (GMT)
committerGeorg Brandl <georg@python.org>2008-05-20 08:40:43 (GMT)
commit88659b0ab29c1022ce0b4d95e60ddf515ef43b16 (patch)
tree8696c70b6076ef92e71686928475c838d6ac44ca
parent112aa5032985925608844d7421e12703afd6ce41 (diff)
downloadcpython-88659b0ab29c1022ce0b4d95e60ddf515ef43b16.zip
cpython-88659b0ab29c1022ce0b4d95e60ddf515ef43b16.tar.gz
cpython-88659b0ab29c1022ce0b4d95e60ddf515ef43b16.tar.bz2
#2592: delegate nb_index and the floor/truediv slots in weakref.proxy.
-rw-r--r--Lib/test/test_weakref.py23
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/weakrefobject.c10
3 files changed, 35 insertions, 1 deletions
diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py
index 6ca283c..185105b 100644
--- a/Lib/test/test_weakref.py
+++ b/Lib/test/test_weakref.py
@@ -3,6 +3,7 @@ import sys
import unittest
import UserList
import weakref
+import operator
from test import test_support
@@ -187,6 +188,26 @@ class ReferencesTestCase(TestBase):
self.assertEqual(L3[:5], p3[:5])
self.assertEqual(L3[2:5], p3[2:5])
+ def test_proxy_index(self):
+ class C:
+ def __index__(self):
+ return 10
+ o = C()
+ p = weakref.proxy(o)
+ self.assertEqual(operator.index(p), 10)
+
+ def test_proxy_div(self):
+ class C:
+ def __floordiv__(self, other):
+ return 42
+ def __ifloordiv__(self, other):
+ return 21
+ o = C()
+ p = weakref.proxy(o)
+ self.assertEqual(p // 5, 42)
+ p //= 5
+ self.assertEqual(p, 21)
+
# The PyWeakref_* C API is documented as allowing either NULL or
# None as the value for the callback, where either means "no
# callback". The "no callback" ref and proxy objects are supposed
@@ -1059,7 +1080,7 @@ class WeakKeyDictionaryTestCase(mapping_tests.BasicTestMappingProtocol):
def _reference(self):
return self.__ref.copy()
-libreftest = """ Doctest for examples in the library reference: libweakref.tex
+libreftest = """ Doctest for examples in the library reference: weakref.rst
>>> import weakref
>>> class Dict(dict):
diff --git a/Misc/NEWS b/Misc/NEWS
index 156d4bc..850a926 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -36,6 +36,9 @@ Core and Builtins
Extension Modules
-----------------
+- Issue #2592: delegate nb_index and the floor/truediv slots in
+ weakref.proxy.
+
- Support os.O_ASYNC and fcntl.FASYNC if the constants exist on the
platform.
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c
index 0a87b53..1aee5a5 100644
--- a/Objects/weakrefobject.c
+++ b/Objects/weakrefobject.c
@@ -473,6 +473,8 @@ WRAP_BINARY(proxy_add, PyNumber_Add)
WRAP_BINARY(proxy_sub, PyNumber_Subtract)
WRAP_BINARY(proxy_mul, PyNumber_Multiply)
WRAP_BINARY(proxy_div, PyNumber_Divide)
+WRAP_BINARY(proxy_floor_div, PyNumber_FloorDivide)
+WRAP_BINARY(proxy_true_div, PyNumber_TrueDivide)
WRAP_BINARY(proxy_mod, PyNumber_Remainder)
WRAP_BINARY(proxy_divmod, PyNumber_Divmod)
WRAP_TERNARY(proxy_pow, PyNumber_Power)
@@ -492,6 +494,8 @@ WRAP_BINARY(proxy_iadd, PyNumber_InPlaceAdd)
WRAP_BINARY(proxy_isub, PyNumber_InPlaceSubtract)
WRAP_BINARY(proxy_imul, PyNumber_InPlaceMultiply)
WRAP_BINARY(proxy_idiv, PyNumber_InPlaceDivide)
+WRAP_BINARY(proxy_ifloor_div, PyNumber_InPlaceFloorDivide)
+WRAP_BINARY(proxy_itrue_div, PyNumber_InPlaceTrueDivide)
WRAP_BINARY(proxy_imod, PyNumber_InPlaceRemainder)
WRAP_TERNARY(proxy_ipow, PyNumber_InPlacePower)
WRAP_BINARY(proxy_ilshift, PyNumber_InPlaceLshift)
@@ -499,6 +503,7 @@ WRAP_BINARY(proxy_irshift, PyNumber_InPlaceRshift)
WRAP_BINARY(proxy_iand, PyNumber_InPlaceAnd)
WRAP_BINARY(proxy_ixor, PyNumber_InPlaceXor)
WRAP_BINARY(proxy_ior, PyNumber_InPlaceOr)
+WRAP_UNARY(proxy_index, PyNumber_Index)
static int
proxy_nonzero(PyWeakReference *proxy)
@@ -623,6 +628,11 @@ static PyNumberMethods proxy_as_number = {
proxy_iand, /*nb_inplace_and*/
proxy_ixor, /*nb_inplace_xor*/
proxy_ior, /*nb_inplace_or*/
+ proxy_floor_div, /*nb_floor_divide*/
+ proxy_true_div, /*nb_true_divide*/
+ proxy_ifloor_div, /*nb_inplace_floor_divide*/
+ proxy_itrue_div, /*nb_inplace_true_divide*/
+ proxy_index, /*nb_index*/
};
static PySequenceMethods proxy_as_sequence = {