Modules vs Packages
Kirk McDonald
kirklin.mcdonald at gmail.com
Sat Sep 8 12:35:06 PDT 2007
Bill Baxter wrote:
> Jarrett Billingsley wrote:
>
>> "Giuseppe Bilotta" <giuseppe.bilotta at gmail.com> wrote in message
>> news:fbtpp1$2k8t$1 at digitalmars.com...
>>
>>> I see no reason why we couldn't have
>>>
>>> package.d
>>> package/module1.d
>>> package/module2.d
>>>
>>
>> This has been brought up so many times.. I think Walter needs to put
>> an explanation of this on the modules page.
>>
>> I don't see the reason for it either. I think other people have
>> explained it as something along the lines of "packages aren't the same
>> as modules, so you can't have one name map to two things". I don't
>> buy that. I don't see how packages are any different from modules.
>> They're both just namespaces. That's how they work in my scripting
>> language: packages == modules, and you can have packages and modules
>> with the same name.
>>
>> Until (if) this changes, the most common way to do what you want to do
>> in D is to have a "relcomp.all" module which imports everything else.
>
>
> And I recommend .api instead of .all if you don't actually import /all/
> the modules. Or even if you do. Or I suppose you could have both -
> .api being lean and mean API, and .all being the moral equivalent of
> #include <windows.h>.
>
> (This .api convention comes from python, btw.
> see e.g. http://neuroimaging.scipy.org/neuroimaging/ni/ticket/86)
>
> --bb
Python also has a special module name "__init__", which acts as a
central import-point for a package:
package/
__init__.py
foo.py
bar.py
If you say "import package", you're actually importing
package/__init__.py. (In fact, you're required to have at least an empty
__init__.py module. It's presence is what makes a directory be treated
as a package. D does not need this behavior, however.)
Having a specially-named module inside the directory is preferable to
having a same-named module at the same level as the package (which
Python doesn't allow, either), since then the package lives entirely
inside its own directory. (Which is the entire point of having a
package, as I see it.)
The reasons given for the api.py convention in the link above do not
generally apply to D. Something equivalent to __init__.py would be
sufficient. I suggest "this.d". Being a keyword, 'this' cannot be used
as a regular module name. It also evokes existing D syntax (and, indeed,
is like Python using __init__, which is the name Python uses for class
constructors).
It's worth pointing out (again) that D's import, module, and package
semantics are a lot like Python's. It has already shamelessly stolen
selective, static, and renaming imports from Python, and so it should go
whole hog and get this in there, as well.
--
Kirk McDonald
http://kirkmcdonald.blogspot.com
Pyd: Connecting D and Python
http://pyd.dsource.org
More information about the Digitalmars-d
mailing list