[Twisted-Python] How to get the class of the wrapped fget/fset property methods
Adi Roiban
adi at roiban.ro
Mon Nov 23 05:30:53 MST 2015
On 23 November 2015 at 02:32, Glyph Lefkowitz <glyph at twistedmatrix.com>
wrote:
>
> On Nov 22, 2015, at 07:04, Adi Roiban <adi at roiban.ro> wrote:
>
> The @deprecated decorator (at leas on py2.7) does not work when paired
> @property
>
> For deprecated instance variables, our deprecation policy recommend
> converting them into properties and emitted the warning from there.
> It would be nice if we could use the standard @deprecated decorator here.
>
> The problem is that when property are used the fget/fset are received by
> the @deprecated wrapper as functions and not as methods
>
> Is there a way to get the class in which a property is defined... or there
> is no way to use the @deprecated decorator with the @property .. and we
> should create a dedicated deprecatedMember method which is called as a
> normal method.
>
>
> If you care about inheritance, the implementation is a little bit tricky,
> because you have to manually walk the class hierarchy looking for the
> attribute. But conceptually it's pretty simple: just look at the type of
> 'oself' in the __get__ method of the returned descriptor.
>
> Right now, @deprecated is hard-coded to assume a function, but it could be
> repurposed to work with specific other descriptor types reasonably easily.
> *Arbitrary* descriptors might be hard, because it's not clear when to
> emit the message, but specific types like @property should be pretty
> straightforward with an instance check.
>
> I think that we can go with a dedicated instance check for properties...
this is about the @deprecated decorator and using it together with the
deprecation policy for instance members.
I have created a dedicated ticket https://twistedmatrix.com/trac/ticket/8124
I still don't know how to fix it... I tried following property.__get__ and
property.getter and property.fget
>From what I understand of how Python works, at the time when the decorator
is called, the class is not yet created / does not yet exists.
This will not work
class SomeClass(object):
@deprecated(
Version("Twisted", 16, 0, 0), 'the deferred returned by start()')
@property
def deferred(self):
"""
DEPRECATED. Deferred fired when loop stops or fails.
"""
return self._deferred
And I should use something like this
class SomeClass(object):
@property
def deferred(self):
"""
DEPRECATED. Deferred fired when loop stops or fails.
"""
deprecated(
Version("Twisted", 16, 0, 0), 'the deferred returned by
start()')
return self._deferred
---------
Will push the tests and will ask for help in the review queue.
Thanks!
--
Adi Roiban
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20151123/0d637250/attachment-0002.html>
More information about the Twisted-Python
mailing list