bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
1 |
*********************** |
7195.2.2
by Jelmer Vernooij
Fix some more Bazaar references. |
2 |
Breezy Code Style Guide |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
3 |
*********************** |
4 |
||
5 |
Code layout |
|
6 |
=========== |
|
7 |
||
8 |
Please write PEP-8__ compliant code. |
|
9 |
||
10 |
__ http://www.python.org/peps/pep-0008.html |
|
11 |
||
12 |
One often-missed requirement is that the first line of docstrings |
|
13 |
should be a self-contained one-sentence summary. |
|
14 |
||
15 |
We use 4 space indents for blocks, and never use tab characters. (In vim, |
|
16 |
``set expandtab``.) |
|
17 |
||
18 |
Trailing white space should be avoided, but is allowed. |
|
19 |
You should however not make lots of unrelated white space changes. |
|
20 |
||
21 |
Unix style newlines (LF) are used. |
|
22 |
||
23 |
Each file must have a newline at the end of it. |
|
24 |
||
25 |
Lines should be no more than 79 characters if at all possible. |
|
26 |
Lines that continue a long statement may be indented in either of |
|
27 |
two ways: |
|
28 |
||
29 |
within the parenthesis or other character that opens the block, e.g.:: |
|
30 |
||
31 |
my_long_method(arg1, |
|
32 |
arg2, |
|
33 |
arg3) |
|
34 |
||
35 |
or indented by four spaces:: |
|
36 |
||
37 |
my_long_method(arg1, |
|
38 |
arg2, |
|
39 |
arg3) |
|
40 |
||
41 |
The first is considered clearer by some people; however it can be a bit |
|
42 |
harder to maintain (e.g. when the method name changes), and it does not |
|
43 |
work well if the relevant parenthesis is already far to the right. Avoid |
|
44 |
this:: |
|
45 |
||
46 |
self.legbone.kneebone.shinbone.toebone.shake_it(one, |
|
47 |
two, |
|
48 |
three) |
|
49 |
||
50 |
but rather :: |
|
51 |
||
52 |
self.legbone.kneebone.shinbone.toebone.shake_it(one, |
|
53 |
two, |
|
54 |
three) |
|
55 |
||
56 |
or :: |
|
57 |
||
58 |
self.legbone.kneebone.shinbone.toebone.shake_it( |
|
59 |
one, two, three) |
|
60 |
||
61 |
For long lists, we like to add a trailing comma and put the closing |
|
62 |
character on the following line. This makes it easier to add new items in |
|
63 |
future:: |
|
64 |
||
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
65 |
from breezy.goo import ( |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
66 |
jam, |
67 |
jelly, |
|
68 |
marmalade, |
|
69 |
) |
|
70 |
||
71 |
There should be spaces between function parameters, but not between the |
|
72 |
keyword name and the value:: |
|
73 |
||
74 |
call(1, 3, cheese=quark) |
|
75 |
||
5225.2.10
by Martin Pool
More code style guidelines cleanups |
76 |
|
5225.2.11
by Martin Pool
Style guide point about python versions |
77 |
Python versions |
78 |
=============== |
|
79 |
||
7195.2.2
by Jelmer Vernooij
Fix some more Bazaar references. |
80 |
Breezy supports Python 2.7 and Python 3.5 or later. |
5225.2.11
by Martin Pool
Style guide point about python versions |
81 |
|
5225.2.10
by Martin Pool
More code style guidelines cleanups |
82 |
hasattr and getattr |
83 |
=================== |
|
84 |
||
85 |
``hasattr`` should not be used because it swallows exceptions including |
|
86 |
``KeyboardInterrupt``. Instead, say something like :: |
|
87 |
||
88 |
if getattr(thing, 'name', None) is None |
|
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
89 |
|
90 |
||
5418.2.1
by Martin Pool
Text about kwargs from spiv |
91 |
kwargs |
92 |
====== |
|
93 |
||
94 |
``**kwargs`` in the prototype of a function should be used sparingly. |
|
95 |
It can be good on higher-order functions that decorate other functions, |
|
5418.2.5
by Martin Pool
Cleanup style of developer advice about kwargs |
96 |
such as ``addCleanup`` or ``assertRaises``, or on functions that take only |
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
97 |
(or almost only) kwargs, where any kwargs can be passed. |
5418.2.1
by Martin Pool
Text about kwargs from spiv |
98 |
|
5418.2.5
by Martin Pool
Cleanup style of developer advice about kwargs |
99 |
Otherwise, be careful: if the parameters to a function are a bit complex |
100 |
and might vary over time (e.g. the ``commit`` API) then we prefer to pass an |
|
101 |
object rather than a bag of positional and/or keyword args. If you have |
|
102 |
an arbitrary set of keys and values that are different with each use (e.g. |
|
103 |
string interpolation inputs) then again that should not be mixed in with |
|
104 |
the regular positional/keyword args, it seems like a different category of |
|
105 |
thing. |
|
5418.2.1
by Martin Pool
Text about kwargs from spiv |
106 |
|
107 |
||
5418.2.3
by Martin Pool
Code guideline about imitating standard objects |
108 |
Imitating standard objects |
109 |
========================== |
|
110 |
||
111 |
Don't provide methods that imitate built-in classes (eg ``__in__``, |
|
112 |
``__call__``, ``__int__``, ``__getitem__``) unless the class you're |
|
113 |
implementing really does act like the builtin class, in semantics and |
|
114 |
performance. |
|
115 |
||
116 |
For example, old code lets you say ``file_id in inv`` but we no longer |
|
117 |
consider this good style. Instead, say more explicitly |
|
118 |
``inv.has_id(file_id)``. |
|
119 |
||
120 |
``__repr__``, ``__cmp__``, ``__str__`` are usually fine. |
|
121 |
||
122 |
||
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
123 |
Module Imports |
124 |
============== |
|
125 |
||
126 |
* Imports should be done at the top-level of the file, unless there is |
|
127 |
a strong reason to have them lazily loaded when a particular |
|
128 |
function runs. Import statements have a cost, so try to make sure |
|
129 |
they don't run inside hot functions. |
|
130 |
||
131 |
* Module names should always be given fully-qualified, |
|
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
132 |
i.e. ``breezy.hashcache`` not just ``hashcache``. |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
133 |
|
134 |
||
135 |
Naming |
|
136 |
====== |
|
137 |
||
138 |
Functions, methods or members that are relatively private are given |
|
139 |
a leading underscore prefix. Names without a leading underscore are |
|
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
140 |
public not just across modules but to programmers using breezy as an |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
141 |
API. |
142 |
||
143 |
We prefer class names to be concatenated capital words (``TestCase``) |
|
144 |
and variables, methods and functions to be lowercase words joined by |
|
145 |
underscores (``revision_id``, ``get_revision``). |
|
146 |
||
147 |
For the purposes of naming some names are treated as single compound |
|
148 |
words: "filename", "revno". |
|
149 |
||
150 |
Consider naming classes as nouns and functions/methods as verbs. |
|
151 |
||
152 |
Try to avoid using abbreviations in names, because there can be |
|
153 |
inconsistency if other people use the full name. |
|
154 |
||
155 |
||
156 |
Standard Names |
|
157 |
============== |
|
158 |
||
159 |
``revision_id`` not ``rev_id`` or ``revid`` |
|
160 |
||
161 |
Functions that transform one thing to another should be named ``x_to_y`` |
|
162 |
(not ``x2y`` as occurs in some old code.) |
|
163 |
||
164 |
||
165 |
Destructors |
|
166 |
=========== |
|
167 |
||
168 |
Python destructors (``__del__``) work differently to those of other |
|
169 |
languages. In particular, bear in mind that destructors may be called |
|
170 |
immediately when the object apparently becomes unreferenced, or at some |
|
171 |
later time, or possibly never at all. Therefore we have restrictions on |
|
172 |
what can be done inside them. |
|
173 |
||
5274.3.1
by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets. |
174 |
0. If you think you need to use a ``__del__`` method ask another |
175 |
developer for alternatives. If you do need to use one, explain |
|
176 |
why in a comment. |
|
177 |
||
178 |
1. Never rely on a ``__del__`` method running. If there is code that |
|
5967.8.3
by Martin Pool
Document deprecation of __del__ |
179 |
must run, instead have a ``finally`` block or an ``addCleanup`` call an |
180 |
explicit ``close`` method. |
|
5274.3.1
by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets. |
181 |
|
182 |
2. Never ``import`` from inside a ``__del__`` method, or you may crash the |
|
183 |
interpreter!! |
|
184 |
||
5967.8.3
by Martin Pool
Document deprecation of __del__ |
185 |
3. Prior to bzr 2.4, we sometimes used to raise warnings from del methods |
186 |
that the object was not cleaned up or closed. We no longer do this: |
|
187 |
failure to close the object doesn't cause a test failure; the warning |
|
188 |
appears an arbitrary long time after the problem occurred (the object |
|
189 |
being leaked); merely having a del method inhibits Python gc; the |
|
190 |
warnings appear to users and upset them; they can also break tests that |
|
191 |
are checking what appears on stderr. |
|
7195.2.2
by Jelmer Vernooij
Fix some more Bazaar references. |
192 |
|
5967.8.3
by Martin Pool
Document deprecation of __del__ |
193 |
In short, just don't use ``__del__``. |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
194 |
|
195 |
Cleanup methods |
|
196 |
=============== |
|
197 |
||
5274.3.1
by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets. |
198 |
Often when something has failed later code will fail too, including |
199 |
cleanups invoked from ``finally`` blocks. These secondary failures are |
|
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
200 |
generally uninteresting compared to the original exception. ``breezy`` |
5274.3.1
by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets. |
201 |
has some facilities you can use to mitigate this. |
202 |
||
203 |
* In ``Command`` subclasses, prefer the ``add_cleanup`` method to using |
|
204 |
``try``/``finally`` blocks. E.g. to acquire a lock and ensure it will |
|
205 |
always be released when the command is done:: |
|
206 |
||
207 |
self.add_cleanup(branch.lock_read().unlock) |
|
208 |
||
209 |
This also avoids heavily indented code. It also makes it easier to notice |
|
210 |
mismatched lock/unlock pairs (and other kinds of resource |
|
211 |
acquire/release) because there isn't a large block of code separating |
|
212 |
them. |
|
213 |
||
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
214 |
* Use the ``only_raises`` decorator (from ``breezy.decorators``) when |
5274.3.1
by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets. |
215 |
defining methods that are typically called in ``finally`` blocks, such |
216 |
as ``unlock`` methods. For example, ``@only_raises(LockNotHeld, |
|
217 |
LockBroken)``. All errors that are unlikely to be a knock-on failure |
|
218 |
from a previous failure should be allowed. |
|
219 |
||
220 |
* Consider using the ``OperationWithCleanups`` helper from |
|
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
221 |
``breezy.cleanup`` anywhere else you have a ``finally`` block that |
5274.3.1
by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets. |
222 |
might fail. |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
223 |
|
224 |
||
225 |
Factories |
|
226 |
========= |
|
227 |
||
228 |
In some places we have variables which point to callables that construct |
|
229 |
new instances. That is to say, they can be used a lot like class objects, |
|
5225.2.10
by Martin Pool
More code style guidelines cleanups |
230 |
but they shouldn't be *named* like classes. Things called ``FooBar`` should |
231 |
create an instance of ``FooBar``. A factory method that might create a |
|
232 |
``FooBar`` or might make something else should be called ``foo_factory``. |
|
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
233 |
|
234 |
||
235 |
Registries |
|
236 |
========== |
|
237 |
||
7195.2.2
by Jelmer Vernooij
Fix some more Bazaar references. |
238 |
Several places in Breezy use (or will use) a registry, which is a |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
239 |
mapping from names to objects or classes. The registry allows for |
240 |
loading in registered code only when it's needed, and keeping |
|
241 |
associated information such as a help string or description. |
|
242 |
||
243 |
||
244 |
InterObject and multiple dispatch |
|
245 |
================================= |
|
246 |
||
247 |
The ``InterObject`` provides for two-way `multiple dispatch`__: matching |
|
248 |
up for example a source and destination repository to find the right way |
|
249 |
to transfer data between them. |
|
250 |
||
251 |
.. __: http://en.wikipedia.org/wiki/Multiple_dispatch |
|
252 |
||
253 |
There is a subclass ``InterObject`` classes for each type of object that is |
|
254 |
dispatched this way, e.g. ``InterRepository``. Calling ``.get()`` on this |
|
255 |
class will return an ``InterObject`` instance providing the best match for |
|
256 |
those parameters, and this instance then has methods for operations |
|
257 |
between the objects. |
|
258 |
||
259 |
:: |
|
260 |
||
261 |
inter = InterRepository.get(source_repo, target_repo) |
|
262 |
inter.fetch(revision_id) |
|
263 |
||
264 |
``InterRepository`` also acts as a registry-like object for its |
|
265 |
subclasses, and they can be added through ``.register_optimizer``. The |
|
266 |
right one to run is selected by asking each class, in reverse order of |
|
267 |
registration, whether it ``.is_compatible`` with the relevant objects. |
|
268 |
||
269 |
Lazy Imports |
|
270 |
============ |
|
271 |
||
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
272 |
To make startup time faster, we use the ``breezy.lazy_import`` module to |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
273 |
delay importing modules until they are actually used. ``lazy_import`` uses |
274 |
the same syntax as regular python imports. So to import a few modules in a |
|
275 |
lazy fashion do:: |
|
276 |
||
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
277 |
from breezy.lazy_import import lazy_import |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
278 |
lazy_import(globals(), """ |
279 |
import os |
|
280 |
import subprocess |
|
281 |
import sys |
|
282 |
import time |
|
283 |
||
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
284 |
from breezy import ( |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
285 |
errors, |
286 |
transport, |
|
287 |
revision as _mod_revision, |
|
288 |
) |
|
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
289 |
import breezy.transport |
290 |
import breezy.xml5 |
|
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
291 |
""") |
292 |
||
293 |
At this point, all of these exist as a ``ImportReplacer`` object, ready to |
|
294 |
be imported once a member is accessed. Also, when importing a module into |
|
295 |
the local namespace, which is likely to clash with variable names, it is |
|
296 |
recommended to prefix it as ``_mod_<module>``. This makes it clearer that |
|
297 |
the variable is a module, and these object should be hidden anyway, since |
|
298 |
they shouldn't be imported into other namespaces. |
|
299 |
||
300 |
While it is possible for ``lazy_import()`` to import members of a module |
|
301 |
when using the ``from module import member`` syntax, it is recommended to |
|
302 |
only use that syntax to load sub modules ``from module import submodule``. |
|
303 |
This is because variables and classes can frequently be used without |
|
304 |
needing a sub-member for example:: |
|
305 |
||
306 |
lazy_import(globals(), """ |
|
307 |
from module import MyClass |
|
308 |
""") |
|
309 |
||
310 |
def test(x): |
|
311 |
return isinstance(x, MyClass) |
|
312 |
||
313 |
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer`` |
|
314 |
object, rather than the real class. |
|
315 |
||
316 |
It also is incorrect to assign ``ImportReplacer`` objects to other variables. |
|
317 |
Because the replacer only knows about the original name, it is unable to |
|
318 |
replace other variables. The ``ImportReplacer`` class will raise an |
|
319 |
``IllegalUseOfScopeReplacer`` exception if it can figure out that this |
|
320 |
happened. But it requires accessing a member more than once from the new |
|
321 |
variable, so some bugs are not detected right away. |
|
322 |
||
323 |
||
324 |
The Null revision |
|
325 |
================= |
|
326 |
||
327 |
The null revision is the ancestor of all revisions. Its revno is 0, its |
|
328 |
revision-id is ``null:``, and its tree is the empty tree. When referring |
|
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
329 |
to the null revision, please use ``breezy.revision.NULL_REVISION``. Old |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
330 |
code sometimes uses ``None`` for the null revision, but this practice is |
331 |
being phased out. |
|
332 |
||
333 |
||
334 |
Object string representations |
|
335 |
============================= |
|
336 |
||
337 |
Python prints objects using their ``__repr__`` method when they are |
|
338 |
written to logs, exception tracebacks, or the debugger. We want |
|
339 |
objects to have useful representations to help in determining what went |
|
340 |
wrong. |
|
341 |
||
342 |
If you add a new class you should generally add a ``__repr__`` method |
|
343 |
unless there is an adequate method in a parent class. There should be a |
|
344 |
test for the repr. |
|
345 |
||
346 |
Representations should typically look like Python constructor syntax, but |
|
347 |
they don't need to include every value in the object and they don't need |
|
348 |
to be able to actually execute. They're to be read by humans, not |
|
349 |
machines. Don't hardcode the classname in the format, so that we get the |
|
350 |
correct value if the method is inherited by a subclass. If you're |
|
351 |
printing attributes of the object, including strings, you should normally |
|
352 |
use ``%r`` syntax (to call their repr in turn). |
|
353 |
||
354 |
Try to avoid the representation becoming more than one or two lines long. |
|
355 |
(But balance this against including useful information, and simplicity of |
|
356 |
implementation.) |
|
357 |
||
358 |
Because repr methods are often called when something has already gone |
|
359 |
wrong, they should be written somewhat more defensively than most code. |
|
5566.2.1
by Martin Pool
Code guidelines re exception objects |
360 |
They shouldn't have side effects like doing network or disk |
361 |
IO. |
|
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
362 |
The object may be half-initialized or in some other way in an illegal |
363 |
state. The repr method shouldn't raise an exception, or it may hide the |
|
364 |
(probably more useful) underlying exception. |
|
365 |
||
366 |
Example:: |
|
367 |
||
368 |
def __repr__(self): |
|
369 |
return '%s(%r)' % (self.__class__.__name__, |
|
370 |
self._transport) |
|
371 |
||
372 |
||
373 |
Exception handling |
|
374 |
================== |
|
375 |
||
376 |
A bare ``except`` statement will catch all exceptions, including ones that |
|
377 |
really should terminate the program such as ``MemoryError`` and |
|
378 |
``KeyboardInterrupt``. They should rarely be used unless the exception is |
|
379 |
later re-raised. Even then, think about whether catching just |
|
380 |
``Exception`` (which excludes system errors in Python2.5 and later) would |
|
381 |
be better. |
|
382 |
||
5566.2.1
by Martin Pool
Code guidelines re exception objects |
383 |
The ``__str__`` method on exceptions should be small and have no side |
384 |
effects, following the rules given for `Object string representations`_. |
|
385 |
In particular it should not do any network IO, or complicated |
|
386 |
introspection of other objects. All the state needed to present the |
|
387 |
exception to the user should be gathered before the error is raised. |
|
388 |
In other words, exceptions should basically be value objects. |
|
389 |
||
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
390 |
|
391 |
Test coverage |
|
392 |
============= |
|
393 |
||
7195.2.2
by Jelmer Vernooij
Fix some more Bazaar references. |
394 |
All code should be exercised by the test suite. See the `Breezy Testing |
7192.3.6
by Jelmer Vernooij
Update lots of URLs. |
395 |
Guide <http://www.breezy-vcs.org/developers/testing.html>`_ for detailed |
5225.2.9
by Martin Pool
Split out code style guide from HACKING |
396 |
information about writing tests. |
397 |
||
5225.2.10
by Martin Pool
More code style guidelines cleanups |
398 |
|
399 |
Assertions |
|
400 |
========== |
|
401 |
||
402 |
Do not use the Python ``assert`` statement, either in tests or elsewhere. |
|
403 |
A source test checks that it is not used. It is ok to explicitly raise |
|
404 |
AssertionError. |
|
405 |
||
406 |
Rationale: |
|
407 |
||
7195.2.2
by Jelmer Vernooij
Fix some more Bazaar references. |
408 |
* It makes the behaviour vary depending on whether brz is run with -O |
5274.3.1
by Andrew Bennetts
Expand 'Cleanup methods' section of coding style guide, and also correct some excessively indented bullets. |
409 |
or not, therefore giving a chance for bugs that occur in one case or |
410 |
the other, several of which have already occurred: assertions with |
|
411 |
side effects, code which can't continue unless the assertion passes, |
|
412 |
cases where we should give the user a proper message rather than an |
|
413 |
assertion failure. |
|
414 |
* It's not that much shorter than an explicit if/raise. |
|
415 |
* It tends to lead to fuzzy thinking about whether the check is |
|
416 |
actually needed or not, and whether it's an internal error or not |
|
417 |
* It tends to cause look-before-you-leap patterns. |
|
418 |
* It's unsafe if the check is needed to protect the integrity of the |
|
419 |
user's data. |
|
420 |
* It tends to give poor messages since the developer can get by with |
|
421 |
no explanatory text at all. |
|
422 |
* We can't rely on people always running with -O in normal use, so we |
|
423 |
can't use it for tests that are actually expensive. |
|
424 |
* Expensive checks that help developers are better turned on from the |
|
425 |
test suite or a -D flag. |
|
426 |
* If used instead of ``self.assert*()`` in tests it makes them falsely |
|
427 |
pass with -O. |
|
5225.2.10
by Martin Pool
More code style guidelines cleanups |
428 |
|
429 |
emacs setup |
|
430 |
=========== |
|
431 |
||
432 |
In emacs:: |
|
433 |
||
434 |
;(defface my-invalid-face |
|
435 |
; '((t (:background "Red" :underline t))) |
|
436 |
; "Face used to highlight invalid constructs or other uglyties" |
|
437 |
; ) |
|
438 |
||
439 |
(defun my-python-mode-hook () |
|
440 |
;; setup preferred indentation style. |
|
441 |
(setq fill-column 79) |
|
442 |
(setq indent-tabs-mode nil) ; no tabs, never, I will not repeat |
|
443 |
; (font-lock-add-keywords 'python-mode |
|
444 |
; '(("^\\s *\t" . 'my-invalid-face) ; Leading tabs |
|
445 |
; ("[ \t]+$" . 'my-invalid-face) ; Trailing spaces |
|
446 |
; ("^[ \t]+$" . 'my-invalid-face)); Spaces only |
|
447 |
; ) |
|
448 |
) |
|
449 |
||
450 |
(add-hook 'python-mode-hook 'my-python-mode-hook) |
|
451 |
||
452 |
The lines beginning with ';' are comments. They can be activated |
|
453 |
if one want to have a strong notice of some tab/space usage |
|
454 |
violations. |
|
5225.2.13
by Martin Pool
More reorganization of the developer documentation |
455 |
|
456 |
Portability Tips |
|
457 |
================ |
|
458 |
||
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
459 |
The ``breezy.osutils`` module has many useful helper functions, including |
5225.2.13
by Martin Pool
More reorganization of the developer documentation |
460 |
some more portable variants of functions in the standard library. |
461 |
||
462 |
In particular, don't use ``shutil.rmtree`` unless it's acceptable for it |
|
463 |
to fail on Windows if some files are readonly or still open elsewhere. |
|
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
464 |
Use ``breezy.osutils.rmtree`` instead. |
5225.2.13
by Martin Pool
More reorganization of the developer documentation |
465 |
|
5261.2.1
by Parth Malwankar
added 'Portability Tip' on explicitly closing file to code-style. |
466 |
Using the ``open(..).read(..)`` or ``open(..).write(..)`` style chaining |
467 |
of methods for reading or writing file content relies on garbage collection |
|
468 |
to close the file which may keep the file open for an undefined period of |
|
469 |
time. This may break some follow up operations like rename on Windows. |
|
470 |
Use ``try/finally`` to explictly close the file. E.g.:: |
|
5225.2.13
by Martin Pool
More reorganization of the developer documentation |
471 |
|
5261.2.1
by Parth Malwankar
added 'Portability Tip' on explicitly closing file to code-style. |
472 |
f = open('foo.txt', 'w') |
473 |
try: |
|
474 |
f.write(s) |
|
475 |
finally: |
|
476 |
f.close() |
|
5225.2.13
by Martin Pool
More reorganization of the developer documentation |
477 |
|
5278.1.1
by Martin Pool
Call out a couple of GNU policy points about naming (gnu/linux etc) |
478 |
|
5436.2.4
by Andrew Bennetts
Add section to code-style.txt recommending get_named_object. |
479 |
Dynamic imports |
480 |
=============== |
|
481 |
||
482 |
If you need to import a module (or attribute of a module) named in a |
|
483 |
variable: |
|
484 |
||
485 |
* If importing a module, not an attribute, and the module is a top-level |
|
486 |
module (i.e. has no dots in the name), then it's ok to use the builtin |
|
487 |
``__import__``, e.g. ``__import__(module_name)``. |
|
6803.1.1
by Jelmer Vernooij
Bunch of developer docs changes: |
488 |
* In all other cases, prefer ``breezy.pyutils.get_named_object`` to the |
5436.2.4
by Andrew Bennetts
Add section to code-style.txt recommending get_named_object. |
489 |
built-in ``__import__``. ``__import__`` has some subtleties and |
490 |
unintuitive behaviours that make it hard to use correctly. |
|
491 |
||
5225.2.13
by Martin Pool
More reorganization of the developer documentation |
492 |
.. |
493 |
vim: ft=rst tw=74 ai |