[pypy-commit] pypy default: Compatibility: implement staticmethod.__init__ and classmethod.__init__
rlamy
pypy.commits at gmail.com
Wed Oct 26 11:04:07 EDT 2016
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch:
Changeset: r87938:82c402ba12b1
Date: 2016-10-25 18:05 +0100
http://bitbucket.org/pypy/pypy/changeset/82c402ba12b1/
Log: Compatibility: implement staticmethod.__init__ and
classmethod.__init__ (backport of 6961be5cf15d)
diff --git a/pypy/interpreter/function.py b/pypy/interpreter/function.py
--- a/pypy/interpreter/function.py
+++ b/pypy/interpreter/function.py
@@ -622,8 +622,11 @@
def descr_staticmethod__new__(space, w_subtype, w_function):
instance = space.allocate_instance(StaticMethod, w_subtype)
- instance.__init__(w_function)
- return space.wrap(instance)
+ instance.__init__(space.w_None)
+ return instance
+
+ def descr_init(self, space, w_function):
+ self.w_function = w_function
class ClassMethod(W_Root):
@@ -641,8 +644,11 @@
def descr_classmethod__new__(space, w_subtype, w_function):
instance = space.allocate_instance(ClassMethod, w_subtype)
- instance.__init__(w_function)
- return space.wrap(instance)
+ instance.__init__(space.w_None)
+ return instance
+
+ def descr_init(self, space, w_function):
+ self.w_function = w_function
class FunctionWithFixedCode(Function):
can_change_code = False
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -686,15 +686,17 @@
(e.g. C().f()). The instance is ignored except for its class.""",
__get__ = interp2app(StaticMethod.descr_staticmethod_get),
__new__ = interp2app(StaticMethod.descr_staticmethod__new__.im_func),
+ __init__=interp2app(StaticMethod.descr_init),
__func__= interp_attrproperty_w('w_function', cls=StaticMethod),
)
ClassMethod.typedef = TypeDef(
'classmethod',
- __new__ = interp2app(ClassMethod.descr_classmethod__new__.im_func),
- __get__ = interp2app(ClassMethod.descr_classmethod_get),
- __func__= interp_attrproperty_w('w_function', cls=ClassMethod),
- __doc__ = """classmethod(function) -> class method
+ __new__=interp2app(ClassMethod.descr_classmethod__new__.im_func),
+ __init__=interp2app(ClassMethod.descr_init),
+ __get__=interp2app(ClassMethod.descr_classmethod_get),
+ __func__=interp_attrproperty_w('w_function', cls=ClassMethod),
+ __doc__="""classmethod(function) -> class method
Convert a function to be a class method.
diff --git a/pypy/module/__builtin__/test/test_descriptor.py b/pypy/module/__builtin__/test/test_descriptor.py
--- a/pypy/module/__builtin__/test/test_descriptor.py
+++ b/pypy/module/__builtin__/test/test_descriptor.py
@@ -20,6 +20,12 @@
x = Static(1)
assert isinstance(x, Static)
+ class C(Static):
+ def __init__(self, callable):
+ super(C, self).__init__(callable)
+ y = C(1)
+ assert isinstance(y, C)
+
def test_classmethod(self):
class C(object):
def f(cls, stuff):
@@ -41,8 +47,14 @@
x = Classm(1)
assert isinstance(x, Classm)
+ class C(Classm):
+ def __init__(self, callable):
+ super(C, self).__init__(callable)
+ y = C(1)
+ assert isinstance(y, C)
+
def test_property_simple(self):
-
+
class a(object):
def _get(self): return 42
def _set(self, value): raise AttributeError
@@ -98,7 +110,7 @@
assert message.startswith('super(type, obj): obj must be an instance or subtype of type')
def test_super_various(self):
-
+
class A(object):
def meth(self, a):
return "A(%r)" % a
@@ -352,10 +364,10 @@
def test_property_subclass_with_init(self):
l = []
-
+
def x(self):
l.append('x')
-
+
class P(property):
def __init__(self):
property.__init__(self, x)
More information about the pypy-commit
mailing list