Patches item #1706989, was opened at 2007-04-24 18:45
Message generated for change (Comment added) made by gvanrossum
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1706989&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Core (C code)
Group: Python 3000
>Status: Closed
>Resolution: Accepted
Priority: 5
Private: No
Submitted By: Guido van Rossum (gvanrossum)
Assigned to: Guido van Rossum (gvanrossum)
Summary: Implementation of @abstractmethod for PEP 3119

Initial Comment:
This implements a new builtin, abstractmethod, which when used as a method 
decorator declares the method to be abstract, causing the class to be abstract 
(i.e. it cannot be instantiated).  A subclass of an abstract class is still 
abstract unless it overrides all abstract base methods.

----------------------------------------------------------------------

>Comment By: Guido van Rossum (gvanrossum)
Date: 2007-07-11 09:08

Message:
Logged In: YES 
user_id=6380
Originator: YES

Something like this was submitted quite a while ago.

----------------------------------------------------------------------

Comment By: Guido van Rossum (gvanrossum)
Date: 2007-04-25 12:51

Message:
Logged In: YES 
user_id=6380
Originator: YES

Neil: The intention is that only methods can be abstract.  I don't think
we should attempt to only check the __isabstractmethod__ attribute for
objects that we know are methods; that would be an expensive check to make
(you'd have to call __get__ if it exists) and since this is a __magic__
attribute, you void your warrantee if you mess with it. :-)

In this version (v3), I've fixed the C nits and done the refactoring you
suggested, and also added an optimization: check_abstracts() returns
immediately if the base class doesn't have the ABSTRACT flag set.
File Added: abstract.diff

----------------------------------------------------------------------

Comment By: Neal Norwitz (nnorwitz)
Date: 2007-04-25 01:35

Message:
Logged In: YES 
user_id=33168
Originator: NO

Perhaps this is a better question for the PEP rather than the impl, but
can attributes be abstract?

class Foo:
  abstract_override_me = ???

If so, then __isabstractmethod__ might be better named as: 
__isabstract__.  I think this might work:

class Abstract:
  __isabstractmethod__ = True

class Foo:
  abstract_override_me = Abstract()

Do you want arbitrary objects to be able to declare their abstractness or
should the impl also check that an attribute is callable?

check_new_abstracts() should return a Py_ssize_t since it returns the size
of a container (set).  The return value is already captured in a
Py_ssize_t, so it's just the signature (and prototype) that should change.

PySet_Add()s return value isn't checked in check_new_abstracts().  It
might be nice to factor out the common code between the two new functions
into a static helper function.  That would get rid of the PySet_Add
problem.

By calling: PyObject_GetAttrString(meth, "__isabstractmethod__"), that
means a new string object is allocated and then thrown away with each call.
 This could be improved by creating an interned string for
"__isabstractmethod__".  (I realize this is only when types are created
which shouldn't be too often.)

----------------------------------------------------------------------

Comment By: Guido van Rossum (gvanrossum)
Date: 2007-04-24 19:31

Message:
Logged In: YES 
user_id=6380
Originator: YES

Here's a version that compiles with C89 (GCC 2.96) and doesn't leak the
'fast' object.
File Added: abstract.diff

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1706989&group_id=5470
_______________________________________________
Patches mailing list
Patches@python.org
http://mail.python.org/mailman/listinfo/patches

Reply via email to