How to import only one module in a package when the package __init__.py has already imports the modules?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sun Nov 1 06:34:40 CET 2009


On Sat, 31 Oct 2009 22:29:12 -0500, Peng Yu wrote:

>>> In my question, module A and B exist just for the sake of
>>> implementation. Even if I have module A and B, I don't want the user
>>> feel the existence of module A and B. I want them feel exact like
>>> class A and B are defined in module 'test' instead of feeling two
>>> modules A and B are in package 'test'.
>>
>>
>> Inside test/__init__.py:
>>
>> from A import A  # class A from file A.py 
>> from B import B  # class B from file B.py
> 
> I can not use the above approach as I mentioned its problem in my
> previous message.

Either I have not seen it, or I have not understood it, but I don't 
understand why you can not use this approach.


>> or better still:
>>
>> from a import A  # class A from file a.py
>> from b import B  # class B from file b.py
> 
> This artificially introduces the constraint that the file name can not
> be the same as the class/function name. There is no constraint like this
> if I can C++.

It is not a constraint, it is a convention. You are free to ignore it if 
you like.


Some people don't like writing "glob.glob" (for example). Some people 
would like to see Python ban modules with the same name as objects inside 
them, to avoid this error:

>>> import datetime
... much later
>>> from datetime import datetime
>>> datetime.datetime()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'datetime.datetime' has no attribute 
'datetime'


You seem to be inconsistent -- you say you want to name the file the same 
as the function in it, so you know which file to look for a function, but 
then you complain about writing:

test.A.A

so when we suggest naming A.py a.py, so you can write:

test.a.A

you complain about that too. Frankly, I think you are just complaining 
because Python isn't C++.


>>> I know that module names should be in lower cases, in general.
>>> However, it is OK to have the module name capitalized in this case
>>> since the end users don't see them.
>>
>> Of course they do.
> 
> This sentence is confusing. Can you spell out what you mean?

If you supply a package

test/
+--  __init__.py
+--  A.py
+--  B.py


there is nothing stopping your users from doing this:

import test.A as A
import test.B as SomethingElse


[...]
> I have defined 'long' in one of my previous message. I consider a file
> long, when it does not fit in one or two screen. Basically, I want to
> get a whole picture of the file after glancing of the file.

You must only write incredibly trivial programs then.

There is more to understanding a program than understanding one single 
function. Any serious function will call other functions. To get the 
whole picture, you have to understand them too. Your requirement simply 
shifts the burden from "open one file, and read ten functions" to "open 
ten files, and read ten functions". 


-- 
Steven



More information about the Python-list mailing list