-
Notifications
You must be signed in to change notification settings - Fork 31
Expand file tree
/
Copy path09-modules.slim
More file actions
314 lines (245 loc) · 11.8 KB
/
09-modules.slim
File metadata and controls
314 lines (245 loc) · 11.8 KB
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
= slide 'Модули 101' do
list:
Всяко нещо в Python е част от някой модул
Дори нещата, които пишем в интерактивната конзола, са в модул
Всеки файл с разширение .py е модул. Името на модула е името на файла (без .py)
Всяка директория може да бъде модул
Файлът, от който е стартирана програмата, е с име __main__
= slide '.pyc' do
list:
.pyc са прекомпилирани версии на .py файловете ни
В Python 3 стоят в директорията __pycache__
В Python 2 стоят до .py файловете
Можем да ги дезактивираме генерално
Не мислим за тях
(освен при version control)
= slide 'import' do
list:
Всеки модул се импортва само по веднъж
При импортването му се изпълнява целият файл
= slide 'В този ред на мисли, показвали ли сме ви това:' do
annotate:
import __hello__
= slide 'Модули' do
annotate:
from module import a, b, c
a()
= slide 'Модули' do
annotate:
from module import a, b, c
a()
from module import a as b
b()
= slide 'Модули' do
annotate:
from module import a, b, c
a()
from module import a as b
b()
from django.contrib.auth.models import User
my_user = User()
= slide 'Модули' do
annotate:
from django.db import models
my_model = models.Model()
= slide 'Модули' do
annotate:
import datetime
now = datetime.datetime.now()
= slide 'if __name__ == "__main__":' do
p Така можете да сте сигурни, че текущият файл е изпълнен, а не импортнат
= slide 'Search Path' do
list:
"вградените модули"
текущата директория
sys.path
annotate:
>>> import sys
>>> sys.path
[
'',
'/usr/lib/python3.4',
'/usr/lib/python3.4/plat-linux',
'/usr/lib/python3.4/lib-dynload',
'/usr/lib/python3.4/site-packages',
]
= slide 'dir()' do
p Връща списък със всички имена в модул
annotate:
import sys
dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__',
'__loader__', '__name__', '__package__', '__spec__', '__stderr__',
'__stdin__', '__stdout__', '_clear_type_cache', '_current_frames',
'_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions',
'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix',
'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info',
'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info',
'float_repr_style', 'getallocatedblocks', 'getcheckinterval',
'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding',
'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof',
'getswitchinterval', 'gettrace', 'hash_info', 'hexversion',
'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode',
'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache',
'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace',
'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info',
'warnoptions']
= slide 'Пакети' do
list:
Модули, изградени само от файлове е твърде плоско решение
Можем да групираме няколко файла (модули) в един свръх-модул
За да направим една директория модул, трябва да създадем __init__.py файл вътре
Това е инициализаторът на модула и се изпълнява преди всичко останало
annotate:
panda/
__init__.py
head.py
body.py
belly.py
eyes.py
tail.py
# ...
= slide 'Импортване на всичко от даден модул' do
annotate:
from panda import *
ul
li По този начин всичко от модула panda ще бъде "изсипано" в текущия скоуп
li Нямате добра причина да правите това извън интерактивна конзола
li А ние имаме няколко такива да ви отнемаме точки, ако го правите
= slide '__all__' do
list:
Има смисъл в __init__.py да дефинираме списък от стрингове __all__
Само имената в него ще бъдат импортнати, ако се използва *
= slide 'Релативни пътища' do
p Можем да пропуснем търсенето в sys.path и директно да импортнем нещо от текущата директория
annotate:
from . import panda
p Можем да търсим и в "горния" възел
annotate:
from .. import panda
p Или:
annotate:
from ..panda import tail
= slide 'Инсталиране на пакети' do
p Long story short
annotate:
pip install package-name-goes-here
= slide 'В живия живот' do
p Драми
list:
Различни проекти зависят от различни версии на една и съща библиотека
Различни проекти зависят от различни библиотеки, между които съществуват конфликти
Системно инсталирания питон обикновено в нещо като <code>/usr/lib/python3.4</code> ⇨ трябват ни root права за инсталиране
Искаме няколко различни версии на питон, но не искаме да се интересуваме от това, когато пускаме нашето приложение
Ако ползвате нещо unix-like, много вероятно е много неща да зависят от python и python библиотеки. Предпочитаме да не ги чупим
= slide 'virtualenv' do
p Изолирани обкръжения за python кода ни, в които можем да инсталираме каквото си искаме и да ползваме, която си искаме версия на python
annotate:
$ virtualenv ~/panda_env
$ source ~/panda_env/bin/activate
(panda_env)$ which python
/home/pandyo/panda_env/bin/python
(panda_env)$ which pip
/home/pandyo/panda_env/bin/pip
(panda_env)$ pip install dateutils
…
= slide 'virtualenv' do
annotate:
>>> import dateutils
>>> dateutils
<module 'dateutils' from '/home/pandyo/panda_env/lib/python3.4/site-packages/dateutils/__init__.py'>
p Когато приключим, можем да изпълним shell функцията <code>deactivate</code> или просто да излезем от shell-а
= slide 'virtualenv is awesome!' do
p Изолация, разделяне на отговорности, поддържане на адекватни версии на зависимостите, …
p Когато нещо много страшно се счупи, триете една папка и инсталирате само пакетите, които са нужни за един проект
= slide 'virtualenv is (pretty) awesome!' do
p Само т'ва експлицитно писане на директории и source-ване на shell скриптове е малко грозно…
= slide 'virtualenvwrapper is actually incredibly awesome!' do
annotate:
$ sudo pip install virtualenvwrapper
…
$ mkvirtualenv panda
annotate:
$ workon panda
(panda)$
= slide 'От къде ги тегли?' do
p <a href="https://pypi.python.org/">PyPI - the Python Package Index</a>
= slide 'Как да качим пакет там?' do
list:
Първо трябва да си създадем пакет
Имаме нужда от модула setuptools
setup.py файл в основната директория на проекта
И изпълнение на setup() в него
= slide 'Пример' do
annotate:
from setuptools import setup, find_packages
setup(
name="hello_world",
version="0.1",
packages=find_packages(),
install_requires=['world>=1'],
author="Me",
author_email="me@example.com",
description="This is an Example Package",
license="PSF",
keywords="hello world example examples",
url="http://example.com/hello_world/"
)
= slide 'Classifiers' do
annotate:
setup(...,
classifiers=[
'Development Status :: 4 - Beta',
'Environment :: Console',
'Environment :: Web Environment',
'Intended Audience :: End Users/Desktop',
'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
'License :: OSI Approved :: Python Software Foundation License',
'Operating System :: MacOS :: MacOS X',
'Operating System :: Microsoft :: Windows',
'Operating System :: POSIX',
'Programming Language :: Python',
'Topic :: Communications :: Email',
'Topic :: Office/Business',
'Topic :: Software Development :: Bug Tracking',
],
)
p <a href="https://pypi.python.org/pypi?%3Aaction=list_classifiers">List trove classifiers</a>
= slide 'Добре, имаме го и сега какво?' do
list:
python setup.py install - Инсталира
python setup.py sdist - Създава архив, който лесно може да бъде инсталиран
python setup.py bdist_wininstsdist - Създава инсталатор за уиндолс
...
= slide 'PyPI' do
annotate:
python setup.py register
python setup.py sdist upload
= slide 'Терминология' do
list:
module
pure python module
extension module
package
root package
egg
= slide 'wheel' do
list:
Нов формат, целящ да замени egg
Не изпълнява setup.py на клиентската машина
Няма нужда от компилатор за C, ако пакетът зависи от модули на C
По-бърза и консистентна инсталация
p <a href="https://www.python.org/dev/peps/pep-0427/">PEP 427</a>
= slide 'Защо пък wheel?' do
list:
Python packaging - <b>reinvented</b>.
A container for cheese.
It makes it easier to <b>roll</b> out software.
Get it? Get it?
= slide 'Какво да направим за целта?' do
example:
pip install wheel
python setup.py bdist_wheel