@@ -96,8 +96,10 @@ Also known as PEP 20, the guiding principles for Python's design.
96
96
If the implementation is easy to explain, it may be a good idea.
97
97
Namespaces are one honking great idea -- let's do more of those!
98
98
99
- See `<http://stackoverflow.com/questions/228181/the-zen-of-python >`_ for some
100
- examples.
99
+ For some examples of good Python style, see `this Stack Overflow question
100
+ <http://stackoverflow.com/questions/228181/the-zen-of-python> `_ or `these
101
+ slides from a Python user group
102
+ <http://artifex.org/~hblanks/talks/2011/pep20_by_example.pdf> `_.
101
103
102
104
PEP 8
103
105
-----
@@ -106,16 +108,18 @@ PEP 8 is the de-facto code style guide for Python.
106
108
107
109
`PEP 8 <http://www.python.org/dev/peps/pep-0008/ >`_
108
110
109
- There exists a command-line program, `pep8 ` that can check your code for
110
- conformance.
111
+ Conforming your Python code to PEP 8 is generally a good idea and helps make
112
+ code more consistent when working on projects with other developers. There
113
+ exists a command-line program, `pep8 <https://github.com/jcrocholl/pep8 >`_,
114
+ that can check your code for conformance. Install it by running the following
115
+ command in your Terminal:
111
116
112
117
::
113
118
114
- pip install pep8
119
+ $ pip install pep8
115
120
116
121
117
- Simply run it on a file or series of files and get a report of any
118
- violations
122
+ Then run it on a file or series of files to get a report of any violations.
119
123
120
124
::
121
125
@@ -129,5 +133,175 @@ violations
129
133
optparse.py:472:29: E221 multiple spaces before operator
130
134
optparse.py:544:21: W601 .has_key() is deprecated, use 'in'
131
135
132
- Conforming your style to PEP 8 is generally a good idea and helps make code a lot
133
- more consistent when working on projects with other developers.
136
+ Conventions
137
+ :::::::::::
138
+
139
+ Here are some conventions you should follow to make your code easier to read.
140
+
141
+ Check if variable equals a constant
142
+ -----------------------------------
143
+
144
+ You don't need to explicitly compare a value to True, or None, or 0 - you can
145
+ just add it to the if statement.
146
+
147
+ **Bad **:
148
+
149
+ .. code-block :: python
150
+
151
+ if attr == True :
152
+ print ' True!'
153
+
154
+ if attr == None :
155
+ print ' attr is None!'
156
+
157
+ **Good **:
158
+
159
+ .. code-block :: python
160
+
161
+ # Just check the value
162
+ if attr:
163
+ print ' True!'
164
+
165
+ # or check for the opposite
166
+ if not attr:
167
+ print ' attr is None!'
168
+
169
+ Access a Dictionary Element
170
+ ---------------------------
171
+
172
+ Don't use the ``has_key `` function. Instead use ``x in d `` syntax, or pass
173
+ a default argument to ``get ``.
174
+
175
+ **Bad **:
176
+
177
+ .. code-block :: python
178
+
179
+ d = {' hello' : ' world' }
180
+ if d.has_key(' hello' ):
181
+ print d[' hello' ] # prints 'world'
182
+ else :
183
+ print ' default_value'
184
+
185
+ **Good **:
186
+
187
+ .. code-block :: python
188
+
189
+ d = {' hello' : ' world' }
190
+
191
+ print d.get(' hello' , ' default_value' ) # prints 'world'
192
+ print d.get(' thingy' , ' default_value' ) # prints 'default_value'
193
+
194
+ # Or:
195
+ if ' hello' in d:
196
+ print d[' hello' ]
197
+
198
+ Short Ways to Manipulate Lists
199
+ ------------------------------
200
+
201
+ `List comprehensions
202
+ <http://docs.python.org/tutorial/datastructures.html#list-comprehensions> `_
203
+ provide a powerful, concise way to work with lists. Also, the `map
204
+ <http://docs.python.org/library/functions.html#map> `_ and `filter
205
+ <http://docs.python.org/library/functions.html#filter> `_ functions can perform
206
+ operations on lists using a different concise syntax.
207
+
208
+ **Bad **:
209
+
210
+ .. code-block :: python
211
+
212
+ # Filter elements less than 5
213
+ a = [3 , 4 , 5 ]
214
+ b = []
215
+ for i in a:
216
+ if a > 4 :
217
+ b.append(a)
218
+
219
+ **Good **:
220
+
221
+ .. code-block :: python
222
+
223
+ b = [i for i in a if i > 4 ]
224
+ b = filter (lambda x : x > 4 , a)
225
+
226
+ **Bad **:
227
+
228
+ .. code-block :: python
229
+
230
+ # Add three to all list members.
231
+ a = [3 , 4 , 5 ]
232
+ count = 0
233
+ for i in a:
234
+ a[count] = i + 3
235
+ count = count + 1
236
+
237
+ **Good **:
238
+
239
+ .. code-block :: python
240
+
241
+ a = [3 , 4 , 5 ]
242
+ a = [i + 3 for i in a]
243
+ # Or:
244
+ a = map (lambda i : i + 3 , a)
245
+
246
+ Use `enumerate <http://docs.python.org/library/functions.html#enumerate >`_ to
247
+ keep a count of your place in the list.
248
+
249
+ .. code-block :: python
250
+
251
+ for i, item in a:
252
+ print i + " , " + item
253
+ # prints
254
+ # 0, 3
255
+ # 1, 4
256
+ # 2, 5
257
+
258
+ Read From a File
259
+ ----------------
260
+
261
+ Use the ``with open `` syntax to read from files. This will automatically close
262
+ files for you.
263
+
264
+ **Bad **:
265
+
266
+ .. code-block :: python
267
+
268
+ f = open (' file.txt' )
269
+ a = f.read()
270
+ print a
271
+ f.close()
272
+
273
+ **Good **:
274
+
275
+ .. code-block :: python
276
+
277
+ with open (' file.txt' ) as f:
278
+ for line in f:
279
+ print line
280
+
281
+ Returning Multiple Values from a Function
282
+ -----------------------------------------
283
+
284
+ Python supports returning multiple values from a function as a comma-separated
285
+ list, so you don't have to create an object or dictionary and pack multiple
286
+ values in before you return
287
+
288
+ **Bad **:
289
+
290
+ .. code-block :: python
291
+
292
+ def math_func (a ):
293
+ return {' square' : a ** 2 , ' cube' : a ** 3 }
294
+
295
+ d = math_func(3 )
296
+ s = d[' square' ]
297
+ c = d[' cube' ]
298
+
299
+ **Good **:
300
+
301
+ .. code-block :: python
302
+
303
+ def math_func (a ):
304
+ return a ** 2 , a ** 3
305
+
306
+ square, cube = math_func(3 )
307
+
0 commit comments