[Python-3000] pep 3124 plans
Phillip J. Eby
pje at telecommunity.com
Tue Jul 24 02:51:09 CEST 2007
At 11:58 AM 7/24/2007 +1200, Greg Ewing wrote:
>Phillip J. Eby wrote:
> > In order to follow things through with normal method calls, you have to
> > know where a class is in the program, implying that you either search
> > for it, or have read enough of the program to figure it out.
> >
> > Which of these two things is different with generic functions?
>
>A class is defined in just one place, or a limited number
>of places if it has base classes.
...and may be subclassed in an unlimited number of places.
A generic function is defined in just one place, with a limited
number of "generic" methods typically adjoining it, and may be
extended in an unlimited number of places.
Where's the difference?
>It also provides a convenient mental chunk under which to
>group all the operations that it implements. With GFs, there
>is no such obvious mental grouping.
The function itself is the grouping, in the same way that Python's
operator.* functions are, or its built-in generics like len() and
iter(). len() encapsulates the concept of "sequence", just as iter()
encapsulates "iterable", and operator.add encapsulates "addition".
These are conceptual categories that can't be defined by classes,
except by conventions like ABCs -- and ISTR the ABCs PEP ran into
trouble dealing with n-ary operators where n>1.
> > if you're going to be
> > grepping for 'foo', it doesn't matter whether it's a method name or a
> > generic function name -- you're still going to find all the definitions.
>
>No, you're going to find every function whose name is 'foo',
>whether it's a method of the particular GF you have in mind
>or not.
And this doesn't apply to normal methods? Come on. This is far
*more* likely to be a problem with normal methods than it is with
generic functions. For one thing, you can isolate your search to
modules that import the function being overridden -- something you
can't do with normal methods.
> > Since they make my world simpler,
>
>Are you talking about code that you've written yourself here,
>or do you find they make code written by others easier to
>understand as well?
Yes, I find code written using generics to be generally easier to
understand, because it's possible to grasp a generic operator without
needing to understand all the classes it can be applied to.
For example, the generic function operator.add in Python defines the
concept of addition, without me needing to understand all possible
types that might be added together.
And since all non-trivial Python code already uses generic functions,
I find that they do in fact make all Python code simpler to
understand. Indeed, they're a significant contributor to Python's
ease-of-use. PEP 3124 seeks to expand that ease by allowing people
to easily add their own generic functions, without needing to use
workarounds like interfaces and adapters.
>I'd have to disagree with such a blanket statement.
The thing that you seem to keep missing in your analysis is that
Python already *has* generic functions in the language specification,
and has had them for what, 10, 15 years? If any of these problems
you're talking about actually existed, I think we'd already know about them.
Or are you arguing that functions like len() and iter() make progams
harder to understand in all the same ways that you're saying that
adding a standard GF library will?
> > Grep (or whatever global search tool your
> > editor provides) is your friend. It ain't perfect, but it's just as
> > much required (and equally imperfect) for global analysis of a
> > traditionally-OO program.
>
>Most of the time I find that I don't need to perform global
>analysis of a traditionally-OO paradigm. The conceptual
>encapsulation provided by classes makes that unnecessary.
>GF breaks that encapsulation, or at least to my mind it
>seems to, and that makes me uncomfortable.
That's because you're ignoring the GFs (and operators implemented as
GF's) that you use all day long in even the most trivial of Python
programs, let alone ones that use pickle or copy or pprint. Even
computing a sum such as 2+2 involves a generic function in Python!
All PEP 3124 proposes to do is have a standard API for
programmatically adding methods to generic functions, irrespective of
how those functions are internally implemented. Its decorators are
to generic functions what 'setattr()' is to objects: i.e., a generic
function for manipulating their contents.
It doesn't really "add generic functions to Python", because Python
already had them.
More information about the Python-3000
mailing list