[Python-ideas] method decorators @final and @override in Python 2.4
Steven D'Aprano
steve at pearwood.info
Mon Mar 30 00:29:28 CEST 2009
On Mon, 30 Mar 2009 09:03:03 am Scott David Daniels wrote:
> Steven D'Aprano wrote:
> > ... Perhaps I just haven't worked on enough 20,000 line projects,
> > but I don't get the point of @override. It doesn't prevent somebody
> > from writing (deliberately or accidentally) B.F in the absence of
> > A.F, since the coder can simply leave off the @override.
>
> ? B.F vs. A.F? Could you expand this a trifle?
Classes B and A, method F.
In case it is still unclear, I'm referencing Péter Szabó's post, which
we both quoted:
> > I think we have a different understanding what @override means. I
> > define @override like this: ``class B(A): @override def F(self):
> > pass'' is OK only if A.F is defined, i.e. there is a method F to
> > override.
The intention is that this will fail:
class A: pass
class B(A):
@override
def F(self): pass
but this will be okay:
class A:
def F(self): pass
class B(A):
@override
def F(self): pass
But if I leave out the @override then I can define B.F regardless of
whether or not A.F exists, so it doesn't prevent the creation of B.F.
> > If @override is just a way of catching spelling mistakes, perhaps
> > it would be better in pylint or pychecker. What have I missed?
>
> If, for example, you have a huge testing framework, and some
> developers are given the task of developing elements from the
> framework by (say) overriding the test_sources and test_outcome
> methods, They can be handed an example module with @override
> demonstrating where to make the changes.
"# OVERRIDE" or "# TODO" will do that just as well.
> class TestMondoDrive(DriveTestBase):
>
> @override
> def test_sources(self):
> return os.listdir('/standard/mondo/tests')
>
> @override
> def test_outcome(self, testname, outcome):
> if outcome != 'success':
> self.failures('At %s %s failed: %s' % (
> time.strftime('%Y.%m.%d %H:%M:%S'),
> test_name, outcome))
> else:
> assert False, "I've no idea how to deal with
> success"
>
> The resulting tests will be a bit easier to read, because you can
> easily distinguish between support methods and framework methods.
Maybe so, but comments and/or naming conventions do that too.
> Further, the entire warp drive test is not started if we stupidly
> spell the second "test_result" (as it was on the Enterprise tests).
That's a reasonable benefit, but it still sounds to me like something
that should go in pylint.
I don't really have any objection to this, and Guido has already said it
should go into a third party module first. Thank you for explaining the
use-case.
--
Steven D'Aprano
More information about the Python-ideas
mailing list