import and package confusion

Scott David Daniels Scott.Daniels at Acm.Org
Wed Apr 29 18:06:13 EDT 2009


Dale Amon wrote:
> On Wed, Apr 29, 2009 at 01:12:33PM -0700, Scott David Daniels wrote:
>   
>> Dale Amon wrote:
>>     
>>> I am trying to get to the heart of what it is I am
>>> missing. Is it the case that if you have a module C in a package A:
>>> 	A.C
>>> that there is no way to load it such that you can use:
>>> 	x = A.C()
>>> in your code? 
>>>       
>> OK, here's a simple question.  What do you expect from:
>>    import sys
>>    sys()
>> sys is a module, and as such, it is not callable.
>>     
You did not answer the question above, and I think the answer is the root
of your misunderstanding.  A class and a module are _not_the_same_thing_.
sys is not a package, it is a module.
>> Just because you put a class inside a module, does not mean
>> that class magically does something by virtue of having the
>> same name as the module.
>>
>> A module is a namespace to hold classes, functions, etc....
>> A package is a namespace to hold modules (possibly more).
>>
>> I don't understand why you don't use files like:
>>
>> 	VLMLegacy/
>>          __init__.py
>>          Reader.py
>>          VLM4997.py
>>          WINGTL.py
Unlike Java, we are free to have several things in a module:

several classes, several functions, several constants....


> There are n different similar systems, each with multiple classes.
> They could either be implimented as a class at the first level:
>
> 	VLMLegacy
> 	   Condition.py
> 	   Plan.py
>              |
>              |
>             etc
>
> but in that case each class will be filled with conditionals
> that try to do the correct thing depending on which system's
> data they are reading. That approach has already gotten *insane*
> and I need to objectify things: put all the common code into 
> abstract superclasses, and then create a subclass for each 
> different system (of which there will be an unknown number added
> over time), ie:
>
> 	VLMLegacy/
> 	   Conditions.py	Abstract classes
> 	   Plan.py
>              |
>              |
>             etc
> 	   TYPE1/		Subclasses of above specific to Type 1
> 		   Conditions.py
> 		   Plan.py
>         	     |
> 	             |
> 	            etc
> 	   TYPE2/		Subclasses for Type 2
> 		   Conditions.py
> 		   Plan.py
>         	     |
> 	             |
> 	            etc
>
>              |
> 	   TYPEn/		Subclasses for Type n
> 		   Conditions.py
> 		   Plan.py
>         	     |
> 	             |
> 	            etc
>
> Every VLMLegacy.TYPEn.Conditions (or other class) has exactly...
>   
But VLMLegacy.TYPEn.Conditions is a _module_, not a _class_.
I suggest VLM4497.py look a bit like the following:
    from VLMLegacy import abstract_classes
    class Condition(abstract_classes.BaseCondition):
         ...
    class Plan(abstract_classes.BasePlan):
         ...
    Header = abstract_classes.BaseHeader # Note we needed no customization
    ...
> the same set of methods; each of those methods inherits much 
> of its basic behavior from VLMLegacy.Conditions.
>
> If I make every subclass a unique name, things will
> rapidly get out of hand, especially when I start
> adding TYPEn+1,2... etc.
>
> So yes, the approach isn't arbitrary, it is a solution
> to real design problems which even the above does not
> fully do justice to.
>
> What I would really like to do when executing is more
> like:
>
> 	type = "VLM4997"
> 	type.Header(args)
> 	type.Plan(args)
> 	type.Conditions(args)
>
> Where the type might change from execution to execution
> or even on different iterations.
>   
Well, "VLM4997" is a _string_, and it has no attributes (nor methods)
named "Header", "Plan", or "Conditions."  And "type" is a perfectly awful
name for a variable, since it hides the builtin named type.  You seem to
confuse names, files, and classes defined in files (at least in your 
writing).

--Scott David Daniels
Scott.Daniels at Acm.Org





More information about the Python-list mailing list