Author: Brian Kearns <[email protected]>
Branch: 
Changeset: r68426:3b5c5d8fc95e
Date: 2013-12-13 17:39 -0500
http://bitbucket.org/pypy/pypy/changeset/3b5c5d8fc95e/

Log:    bin() look for __index__

diff --git a/pypy/module/__builtin__/app_operation.py 
b/pypy/module/__builtin__/app_operation.py
--- a/pypy/module/__builtin__/app_operation.py
+++ b/pypy/module/__builtin__/app_operation.py
@@ -1,4 +1,8 @@
 def bin(x):
-    if not isinstance(x, (int, long)):
-        raise TypeError("must be int or long")
-    return x.__format__("#b")
+    if isinstance(x, (int, long)):
+        value = x
+    elif hasattr(x, '__index__'):
+        value = x.__index__()
+    else:
+        raise TypeError("object cannot be interpreted as an index")
+    return value.__format__("#b")
diff --git a/pypy/module/__builtin__/test/test_builtin.py 
b/pypy/module/__builtin__/test/test_builtin.py
--- a/pypy/module/__builtin__/test/test_builtin.py
+++ b/pypy/module/__builtin__/test/test_builtin.py
@@ -46,6 +46,15 @@
         assert bin(2L) == "0b10"
         assert bin(-2L) == "-0b10"
         raises(TypeError, bin, 0.)
+        class C(object):
+            def __index__(self):
+                return 42
+        assert bin(C()) == bin(42)
+        class D(object):
+            def __int__(self):
+                return 42
+        exc = raises(TypeError, bin, D())
+        assert exc.value.message.find("object cannot be interpreted as an 
index") != -1
 
     def test_unichr(self):
         import sys
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to