Index: Objects/funcobject.c
===================================================================
--- Objects/funcobject.c (Revision 59163)
+++ Objects/funcobject.c (Arbeitskopie)
@@ -643,8 +643,10 @@
static PyObject *
func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
{
- if (obj == Py_None)
- obj = NULL;
+ if (obj == Py_None || obj == NULL) {
+ Py_INCREF(func);
+ return func;
+ }
return PyMethod_New(func, obj, type);
}
Index: Lib/DocXMLRPCServer.py
===================================================================
--- Lib/DocXMLRPCServer.py (Revision 59163)
+++ Lib/DocXMLRPCServer.py (Arbeitskopie)
@@ -74,7 +74,7 @@
title = '%s' % (anchor, name)
if inspect.ismethod(object):
- args, varargs, varkw, defaults = inspect.getargspec(object.im_func)
+ args, varargs, varkw, defaults = inspect.getargspec(object)
# exclude the argument bound to the instance, it will be
# confusing to the non-Python user
argspec = inspect.formatargspec (
Index: Lib/test/test_extcall.py
===================================================================
--- Lib/test/test_extcall.py (Revision 59163)
+++ Lib/test/test_extcall.py (Arbeitskopie)
@@ -231,18 +231,8 @@
x = Foo()
print(Foo.method(*(x, 1, 2)))
print(Foo.method(x, *(1, 2)))
-try:
- print(Foo.method(*(1, 2, 3)))
-except TypeError as err:
- pass
-else:
- print('expected a TypeError for unbound method call')
-try:
- print(Foo.method(1, *(2, 3)))
-except TypeError as err:
- pass
-else:
- print('expected a TypeError for unbound method call')
+print(Foo.method(*(1, 2, 3)))
+print(Foo.method(1, *(2, 3)))
# A PyCFunction that takes only positional parameters should allow an
# empty keyword dictionary to pass without a complaint, but raise a
Index: Lib/test/test_repr.py
===================================================================
--- Lib/test/test_repr.py (Revision 59163)
+++ Lib/test/test_repr.py (Arbeitskopie)
@@ -280,8 +280,8 @@
''')
from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import qux
# Unbound methods first
- eq(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod),
- '')
+ self.failUnless(repr(qux.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.amethod).startswith(
+ '>> C().foo()
-Traceback (most recent call last):
- ...
-TypeError: unbound method foo() must be called with B instance as first argument (got C instance instead)
+called A.foo()
>>> class C(A):
... def foo(self):
Index: Lib/test/test_descr.py
===================================================================
--- Lib/test/test_descr.py (Revision 59163)
+++ Lib/test/test_descr.py (Arbeitskopie)
@@ -280,12 +280,12 @@
c = C()
vereq(interesting(dir(c)), cstuff)
- verify('im_self' in dir(C.Cmethod))
+ #verify('im_self' in dir(C.Cmethod))
c.cdata = 2
c.cmethod = lambda self: 0
vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
- verify('im_self' in dir(c.Cmethod))
+ #verify('im_self' in dir(c.Cmethod))
class A(C):
Adata = 1
@@ -293,13 +293,13 @@
astuff = ['Adata', 'Amethod'] + cstuff
vereq(interesting(dir(A)), astuff)
- verify('im_self' in dir(A.Amethod))
+ #verify('im_self' in dir(A.Amethod))
a = A()
vereq(interesting(dir(a)), astuff)
a.adata = 42
a.amethod = lambda self: 3
vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
- verify('im_self' in dir(a.Amethod))
+ #verify('im_self' in dir(a.Amethod))
# Try a module subclass.
import sys
@@ -1504,8 +1504,11 @@
vereq(D.foo(d, 1), (d, 1))
class E: # *not* subclassing from C
foo = C.foo
- vereq(E().foo, C.foo) # i.e., unbound
- verify(repr(C.foo.__get__(C())).startswith(">
+ verify(r.startswith(">
+ verify(r.startswith(" za() takes exactly 1 positional argument (0 given)
za () {'a': 'aa'} -> ok za aa B D E V a
za () {'d': 'dd'} -> za() got an unexpected keyword argument 'd'
Index: Lib/test/inspect_fodder2.py
===================================================================
--- Lib/test/inspect_fodder2.py (Revision 59163)
+++ Lib/test/inspect_fodder2.py (Arbeitskopie)
@@ -96,7 +96,7 @@
"doc"
return 42
return X
-method_in_dynamic_class = f().g.im_func
+method_in_dynamic_class = f().g
#line 101
def keyworded(*arg1, arg2=1):
Index: Lib/test/test_class.py
===================================================================
--- Lib/test/test_class.py (Revision 59163)
+++ Lib/test/test_class.py (Arbeitskopie)
@@ -552,7 +552,7 @@
self.assertEquals(hash(B.f), hash(A.f))
# the following triggers a SystemError in 2.4
- a = A(hash(A.f.im_func)^(-1))
+ a = A(hash(A.f)^(-1))
hash(a.f)
def test_main():
Index: Lib/test/test_funcattrs.py
===================================================================
--- Lib/test/test_funcattrs.py (Revision 59163)
+++ Lib/test/test_funcattrs.py (Arbeitskopie)
@@ -67,14 +67,9 @@
# In Python 2.1 beta 1, we disallowed setting attributes on unbound methods
# (it was already disallowed on bound methods). See the PEP for details.
-try:
- F.a.publish = 1
-except (AttributeError, TypeError): pass
-else: raise TestFailed('expected AttributeError or TypeError')
+# In Python 3.0 unbound methods are gone.
+F.a.publish = 1
-# But setting it explicitly on the underlying function object is okay.
-F.a.im_func.publish = 1
-
if F.a.publish != 1:
raise TestFailed('unbound method attribute not set to expected value')
@@ -92,31 +87,9 @@
except (AttributeError, TypeError): pass
else: raise TestFailed('expected AttributeError or TypeError')
-# See the comment above about the change in semantics for Python 2.1b1
-try:
- F.a.myclass = F
-except (AttributeError, TypeError): pass
-else: raise TestFailed('expected AttributeError or TypeError')
-
-F.a.im_func.myclass = F
-
-f1.a.myclass
-f2.a.myclass
-f1.a.myclass
-F.a.myclass
-
-if f1.a.myclass is not f2.a.myclass or \
- f1.a.myclass is not F.a.myclass:
- raise TestFailed('attributes were not the same')
-
# try setting __dict__
-try:
- F.a.__dict__ = (1, 2, 3)
-except (AttributeError, TypeError): pass
-else: raise TestFailed('expected TypeError or AttributeError')
+F.a.__dict__ = {'one': 11, 'two': 22, 'three': 33}
-F.a.im_func.__dict__ = {'one': 11, 'two': 22, 'three': 33}
-
if f1.a.two != 22:
raise TestFailed('setting __dict__')
@@ -315,9 +288,9 @@
def test_im_class():
class C:
def foo(self): pass
- verify(C.foo.im_class is C)
+ #verify(C.foo.im_class is C)
verify(C().foo.im_class is C)
- cantset(C.foo, "im_class", C)
+ #cantset(C.foo, "im_class", C)
cantset(C().foo, "im_class", C)
def test_im_func():
@@ -325,19 +298,19 @@
class C:
pass
C.foo = foo
- verify(C.foo.im_func is foo)
+ #verify(C.foo.im_func is foo)
verify(C().foo.im_func is foo)
- cantset(C.foo, "im_func", foo)
+ #cantset(C.foo, "im_func", foo)
cantset(C().foo, "im_func", foo)
def test_im_self():
class C:
def foo(self): pass
- verify(C.foo.im_self is None)
+ #verify(C.foo.im_self is None)
c = C()
- verify(c.foo.im_self is c)
- cantset(C.foo, "im_self", None)
- cantset(c.foo, "im_self", c)
+ #verify(c.foo.im_self is c)
+ #cantset(C.foo, "im_self", None)
+ #cantset(c.foo, "im_self", c)
def test_im_dict():
class C:
@@ -345,24 +318,24 @@
foo.bar = 42
verify(C.foo.__dict__ == {'bar': 42})
verify(C().foo.__dict__ == {'bar': 42})
- cantset(C.foo, "__dict__", C.foo.__dict__)
- cantset(C().foo, "__dict__", C.foo.__dict__)
+ #cantset(C.foo, "__dict__", C.foo.__dict__)
+ #cantset(C().foo, "__dict__", C.foo.__dict__)
def test_im_doc():
class C:
def foo(self): "hello"
verify(C.foo.__doc__ == "hello")
verify(C().foo.__doc__ == "hello")
- cantset(C.foo, "__doc__", "hello")
- cantset(C().foo, "__doc__", "hello")
+ #cantset(C.foo, "__doc__", "hello")
+ #cantset(C().foo, "__doc__", "hello")
def test_im_name():
class C:
def foo(self): pass
verify(C.foo.__name__ == "foo")
verify(C().foo.__name__ == "foo")
- cantset(C.foo, "__name__", "foo")
- cantset(C().foo, "__name__", "foo")
+ #cantset(C.foo, "__name__", "foo")
+ #cantset(C().foo, "__name__", "foo")
def testmore():
test_func_closure()
Index: Lib/test/test_sys.py
===================================================================
--- Lib/test/test_sys.py (Revision 59163)
+++ Lib/test/test_sys.py (Arbeitskopie)
@@ -183,7 +183,7 @@
self.assertRaises(TypeError, sys._getframe, 42, 42)
self.assertRaises(ValueError, sys._getframe, 2000000000)
self.assert_(
- SysModuleTest.test_getframe.im_func.__code__ \
+ SysModuleTest.test_getframe.__code__ \
is sys._getframe().f_code
)
Index: Lib/xml/dom/minicompat.py
===================================================================
--- Lib/xml/dom/minicompat.py (Revision 59163)
+++ Lib/xml/dom/minicompat.py (Arbeitskopie)
@@ -95,7 +95,7 @@
def defproperty(klass, name, doc):
- get = getattr(klass, ("_get_" + name)).im_func
+ get = getattr(klass, ("_get_" + name))
def set(self, value, name=name):
raise xml.dom.NoModificationAllowedErr(
"attempt to modify read-only attribute " + repr(name))