Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #34360 > unrolled thread
| Started by | Matt <matt@woodridgeadvisors.com> |
|---|---|
| First post | 2012-12-05 20:58 -0800 |
| Last post | 2012-12-06 15:44 -0500 |
| Articles | 6 — 5 participants |
Back to article view | Back to comp.lang.python
question about importing a package Matt <matt@woodridgeadvisors.com> - 2012-12-05 20:58 -0800
Re: question about importing a package Chris Angelico <rosuav@gmail.com> - 2012-12-06 16:18 +1100
Re: question about importing a package alex23 <wuwei23@gmail.com> - 2012-12-05 22:30 -0800
Re: question about importing a package Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2012-12-06 06:54 +0000
Re: question about importing a package Matt <matt@woodridgeadvisors.com> - 2012-12-06 08:50 -0800
Re: question about importing a package Terry Reedy <tjreedy@udel.edu> - 2012-12-06 15:44 -0500
| From | Matt <matt@woodridgeadvisors.com> |
|---|---|
| Date | 2012-12-05 20:58 -0800 |
| Subject | question about importing a package |
| Message-ID | <4e72a337-07a2-4759-9960-3e8dab7f1e5c@googlegroups.com> |
I have a directory structure that looks like this:
sample.py
sub_one/
__init__.py # defines only the list __all__ = ['foo', 'bar']
foo.py # defines the function in_foo()
bar.py # defines the function in_bar()
In sample.py, I have this command at the top:
from sub_one import *
I can't refer to in_foo() and in_bar() without prefacing them with the module names. I.e. foo.in_foo() and bar.in_bar() work, but I want to import them in the __main__ namespace of sample.py and refer to them as just in_foo() and in_bar(). I know this is frowned upon, but for my purposes it is the best choice. I have about 30 modules in my package (foos and bars) and I don't want 30 lines at the top of each file that uses this package. What am I doing wrong?
Thanks,
Matt
[toc] | [next] | [standalone]
| From | Chris Angelico <rosuav@gmail.com> |
|---|---|
| Date | 2012-12-06 16:18 +1100 |
| Message-ID | <mailman.545.1354771085.29569.python-list@python.org> |
| In reply to | #34360 |
On Thu, Dec 6, 2012 at 3:58 PM, Matt <matt@woodridgeadvisors.com> wrote: > I have about 30 modules in my package (foos and bars) and I don't want 30 lines at the top of each file that uses this package. What am I doing wrong? Not necessarily wrong, but definitely something to query: WHY do you have thirty modules in your package? How big are your source files - could you simply merge them into a single module? ChrisA
[toc] | [prev] | [next] | [standalone]
| From | alex23 <wuwei23@gmail.com> |
|---|---|
| Date | 2012-12-05 22:30 -0800 |
| Message-ID | <5312ac0b-14cd-46c2-84c9-80d0b3bea8cc@y5g2000pbi.googlegroups.com> |
| In reply to | #34360 |
On 6 Dec, 14:58, Matt <m...@woodridgeadvisors.com> wrote:
> I have a directory structure that looks like this:
>
> sample.py
> sub_one/
> __init__.py # defines only the list __all__ = ['foo', 'bar']
> foo.py # defines the function in_foo()
> bar.py # defines the function in_bar()
>
> In sample.py, I have this command at the top:
>
> from sub_one import *
>
> What am I doing wrong?
The statement `from sub_one import *` imports from sub_one/
__init__.py, which only imports the two modules into its namespace,
not their contents. What you need to do is bring into __init__.py
everything you want the star-import to pull into your code:
__init__.py:
from foo import *
from bar import *
foo.py:
__all__ = [ 'in_foo' ]
def in_foo():
...
bar.py:
__all__ = [ 'in_bar' ]
def in_bar():
...
If you structure is like this, you can restrict which items can be
imported within the defining file. If it doesn't make sense to do it
there, remove __all__ and just import directly in the __init__.
[toc] | [prev] | [next] | [standalone]
| From | Steven D'Aprano <steve+comp.lang.python@pearwood.info> |
|---|---|
| Date | 2012-12-06 06:54 +0000 |
| Message-ID | <50c0413e$0$21853$c3e8da3$76491128@news.astraweb.com> |
| In reply to | #34360 |
On Wed, 05 Dec 2012 20:58:46 -0800, Matt wrote: > I have a directory structure that looks like this: > > sample.py > sub_one/ > __init__.py # defines only the list __all__ = ['foo', 'bar'] > foo.py # defines the function in_foo() > bar.py # defines the function in_bar() > > In sample.py, I have this command at the top: > > from sub_one import * > > I can't refer to in_foo() and in_bar() without prefacing them with the > module names. I.e. foo.in_foo() and bar.in_bar() work, but I want to > import them in the __main__ namespace of sample.py and refer to them as > just in_foo() and in_bar(). Module `sub_one` has two public names, "foo" and "bar", exactly as you say. So when you import * from it, you only get two names. Now, you could do any of these inside sample.py: # 1 from sub_one.foo import in_foo from sub_one.bar import in_bar # 2 from sub_one import * in_foo = foo.in_foo in_bar = bar.in_foo Or you could turn to sub_one.__init__ and do this: # 3 __all__ = ['in_foo', 'in_bar'] from foo import in_foo from bar import in_bar or any combination of the above. -- Steven
[toc] | [prev] | [next] | [standalone]
| From | Matt <matt@woodridgeadvisors.com> |
|---|---|
| Date | 2012-12-06 08:50 -0800 |
| Message-ID | <116c6e9c-88d1-4f16-9d81-8833b3be519d@googlegroups.com> |
| In reply to | #34360 |
It works now. Steven and Alex, thanks for your help! I ended up leaving sample.py and foo.py and bar.p the way they were, and in __init__.py putting: from foo import * from bar import * So my mistake was not importing the foo and bar modules into sub_one/__init__.py. I also see how the __all__ array helps me control what gets imported. I can leave it out of __init__.py, and everything gets imported. So my three lessons are: 1) "from X import *" will look for an __all__ list in module X, or in __init__.py if X is a package instead of a module, and import only what is in that list. Module names are different than function names in that list. 2) if __all__ is not defined, "from X import *' will import everything in X's namespace 3) __init__.py acts like just another module, so you have to import the package contents that you want into it before you import the package into your code Thanks again for the help!
[toc] | [prev] | [next] | [standalone]
| From | Terry Reedy <tjreedy@udel.edu> |
|---|---|
| Date | 2012-12-06 15:44 -0500 |
| Message-ID | <mailman.589.1354826674.29569.python-list@python.org> |
| In reply to | #34403 |
On 12/6/2012 11:50 AM, Matt wrote: > It works now. Steven and Alex, thanks for your help! > > I ended up leaving sample.py and foo.py and bar.p the way they were, and in __init__.py putting: > > from foo import * > from bar import * > > So my mistake was not importing the foo and bar modules into sub_one/__init__.py. > > I also see how the __all__ array helps me control what gets imported. I can leave it out of __init__.py, and everything gets imported. So my three lessons are: > > 1) "from X import *" will look for an __all__ list in module X, or in __init__.py if X is a package instead of a module, and import only what is in that list. Module names are different than function names in that list. > 2) if __all__ is not defined, "from X import *' will import everything in X's namespace ... that does not have a leading underscore. This is why there are things like import sys as _sys from itertools import chain as _chain in the stdlib when the module author does not define __all__. > 3) __init__.py acts like just another module, so you have to import the package contents that you want into it before you import the package into your code -- Terry Jan Reedy
[toc] | [prev] | [standalone]
Back to top | Article view | comp.lang.python
csiph-web