[Python-ideas] ML Style Pattern Matching for Python

Steven D'Aprano steve at pearwood.info
Mon Dec 20 11:08:03 CET 2010


Michael wrote:
> 
> On 19 Dec 2010, at 21:26, Steven D'Aprano <steve at pearwood.info> wrote:
> 
>> Eike Welk wrote:
>>
>>> My positive attitude towards this syntax comes from the only weakness that Python IMHO has: You can't easily see which data attributes an instance has. 
>> What's wrong with dir(obj) and vars(obj)?
[...]
> I think the issue that Elke is pointing out is that dir(Spam) knows nothing about y (whereas it would if you used __slots__).

Then he should have said -- he explicitly said:

"You can't easily see which data attributes an INSTANCE has."
[emphasis added]

As a general rule, you can't expect the class to know what attributes an 
instance has. This is a deliberate design choice. If you want to find 
out what attributes an object has, you ask the object, not the object's 
parent class.

Think of this as a variation on the Law of Demeter: if you want to know 
how many fleas a dog has, inspect the dog, not the dog's owner.


> One answer is to have class member defaults for all instance members.

Well, that's an answer, but I'm not sure what the question is. From time 
to time I create a class which includes default class attributes, which 
then get optionally overridden by instance attributes. But that's much 
rarer than the usual case, where the instance has the attributes and the 
class doesn't.

I would find it very disturbing to see classes declare meaningless class 
attributes (probably set to None) just to make it easier to predict what 
attributes the instances will get. That's pretty close to this horror:

def spam():
     # Declare all local variables which will be used.
     a = None
     b = None
     c = None
     # Now use them.
     a = 1
     b = function(a, 23, -2)
     c = another_func(b)
     return a+b+c


Personally, I've never found this to be a problem in practice. If I want 
to find out what attributes an instance of a class will have, I 
instantiate the class and inspect the instance. Or I read the docs. 
Looking at the source code is also an option (if the source code is 
available). For most classes, any attributes will be set in the __init__ 
method. If you have to read the source to determine what attributes 
exist, there's not much difference between:

class Spam:
     a = 1
     b = 2
     c = 3

and

class Spam:
     def __init(self):
         self.a = 1
         self.b = 2
         self.c = 3


But normally I just care about methods, not data attributes, and for 
that dir(cls) is perfectly adequate. (There may be the odd object that 
includes instance methods, but they'll be rare.)



-- 
Steven



More information about the Python-ideas mailing list