forked from jdb/jdb.github.com
-
Notifications
You must be signed in to change notification settings - Fork 0
/
package.html
179 lines (170 loc) · 8.82 KB
/
package.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Surprising imports — bits v0.7 documentation</title>
<link rel="stylesheet" href="static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '0.7',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="static/jquery.js"></script>
<script type="text/javascript" src="static/underscore.js"></script>
<script type="text/javascript" src="static/doctools.js"></script>
<link rel="top" title="bits v0.7 documentation" href="index.html" />
<link rel="next" title="Missing method" href="missing_method.html" />
<link rel="prev" title="Counters in python" href="counter.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="missing_method.html" title="Missing method"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="counter.html" title="Counters in python"
accesskey="P">previous</a> |</li>
<li><a href="index.html">bits v0.7 documentation</a> »</li>
</ul>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="counter.html"
title="previous chapter">Counters in python</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="missing_method.html"
title="next chapter">Missing method</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="sources/package.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" size="18" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="surprising-imports">
<h1>Surprising imports<a class="headerlink" href="#surprising-imports" title="Permalink to this headline">¶</a></h1>
<p>If <tt class="docutils literal"><span class="pre">from</span> <span class="pre">a</span> <span class="pre">import</span> <span class="pre">b</span> <span class="pre">;</span> <span class="pre">print</span> <span class="pre">b.c</span></tt> works, shouldn’t
<tt class="docutils literal"><span class="pre">import</span> <span class="pre">a</span> <span class="pre">;</span> <span class="pre">print</span> <span class="pre">a.b.c</span></tt> work too? Not necessarily, here is why.</p>
<p>To use an object in Python, the objects needs to be present in the
namespace. To create a new entry in a module namespace, it is possible
to either define the functions and classes <em>or import</em> them from a
package or a module. Packages are also namespaces, <strong>the objects which
are included in the current namespace when the package is imported are
the objects which are defined and imported by the</strong> <tt class="xref py py-mod docutils literal"><span class="pre">__init__.py</span></tt>
module of the package. If <tt class="xref py py-mod docutils literal"><span class="pre">__init__.py</span></tt> is empty for a
package, importing the package does not make the modules in the
package available.</p>
<p>Rule of thumb, if you don’t want surprises always import modules
instead of packages, because with packages, what is imported depends
on the <tt class="xref py py-mod docutils literal"><span class="pre">__init__</span></tt> package and changes.</p>
<p>Here is an example</p>
<div class="highlight-sh"><div class="highlight"><pre>~<span class="nv">$ </span>tree package
package
|-- blabi.py
|-- __init__.py
<span class="sb">`</span>-- shbonz
|-- __init__.py
<span class="sb">`</span>-- shekel.py
</pre></div>
</div>
<p><tt class="xref py py-mod docutils literal"><span class="pre">package</span></tt> and <tt class="xref py py-mod docutils literal"><span class="pre">shbonz</span></tt> are packages (<tt class="xref py py-mod docutils literal"><span class="pre">shbonz</span></tt> is a
<em>subpackage</em>), which means they are filesystem directories with a file
named <em>__init__.py</em> in it. Those can be empty files.</p>
<div class="highlight-sh"><pre>~$ cat package/__init__.py package/shbonz/__init__.py
~$
~$ # the __init__.py are just empty files</pre>
</div>
<p><tt class="xref py py-mod docutils literal"><span class="pre">blabi</span></tt> et <tt class="xref py py-mod docutils literal"><span class="pre">shekel</span></tt> are modules, they contain classes,
functions and constants. Fore example, <tt class="xref py py-mod docutils literal"><span class="pre">shekel</span></tt> defines a
constant <tt class="xref py py-obj docutils literal"><span class="pre">pi</span></tt></p>
<div class="highlight-sh"><div class="highlight"><pre>~<span class="nv">$ </span>cat package/shbonz/shekel.py
<span class="nv">pi</span><span class="o">=</span>3.14
</pre></div>
</div>
<p>As the <em>__init__.py</em> files are empty, they do not import <tt class="xref py py-obj docutils literal"><span class="pre">pi</span></tt>, it
is not available when importing the packages:</p>
<div class="highlight-sh"><div class="highlight"><pre>~<span class="nv">$ </span>python -c <span class="s1">'import package; print package.shbonz.shekel.pi'</span>
Traceback <span class="o">(</span>most recent call last<span class="o">)</span>:
AttributeError: <span class="s1">'module'</span> object has no attribute <span class="s1">'shbonz'</span>
~<span class="nv">$ </span>python -c <span class="s1">'from package import shbonz; print shbonz.shekel.pi'</span>
Traceback <span class="o">(</span>most recent call last<span class="o">)</span>:
AttributeError: <span class="s1">'module'</span> object has no attribute <span class="s1">'shekel'</span>
</pre></div>
</div>
<p>The <em>module</em>, and not its parent packages must be imported, for the
constant to be available:</p>
<blockquote>
~$ python -c ‘from package.shbonz import shekel; print shekel.pi’
3.14</blockquote>
<p>Now if the package’s <tt class="xref py py-mod docutils literal"><span class="pre">__init__</span></tt> module import the constant, it
will be available:</p>
<div class="highlight-sh"><div class="highlight"><pre>~<span class="nv">$ </span><span class="nb">echo</span> <span class="s2">"import shbonz"</span> > package/__init__.py
~<span class="nv">$ </span><span class="nb">echo</span> <span class="s2">"import shekel"</span> > package/shbonz/__init__.py
~<span class="nv">$ </span>python -c <span class="s1">'import package;print package.shbonz.shekel.pi'</span>
3.14
</pre></div>
</div>
<p><a class="reference external" href="http://effbot.org/zone/import-confusion.htm">http://effbot.org/zone/import-confusion.htm</a></p>
<p><em>5 May 2010</em></p>
</div>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="missing_method.html" title="Missing method"
>next</a> |</li>
<li class="right" >
<a href="counter.html" title="Counters in python"
>previous</a> |</li>
<li><a href="index.html">bits v0.7 documentation</a> »</li>
</ul>
</div>
<div class="footer">
© Copyright 2009, Jean Daniel Browne.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.
</div>
</body>
</html>