blob: 9adf63b26da81fbfe9024d47198e8dbb09af730a [file] [log] [blame]
Bill Wendling7d623452015-03-18 13:36:07 -07001====
2YAPF
3====
4
Bill Wendling19c44d02015-04-07 23:48:05 -07005.. image:: https://badge.fury.io/py/yapf.svg
6 :target: http://badge.fury.io/py/yapf
7 :alt: PyPI version
8
Bill Wendlingfb8ab382015-03-18 20:24:14 -07009.. image:: https://travis-ci.org/google/yapf.svg?branch=master
10 :target: https://travis-ci.org/google/yapf
11 :alt: Build status
12
Bill Wendling14ac8812015-04-05 02:47:32 -070013.. image:: https://coveralls.io/repos/google/yapf/badge.svg?branch=master
14 :target: https://coveralls.io/r/google/yapf?branch=master
15 :alt: Coverage status
16
Bill Wendlingf09121c2015-10-20 22:59:33 -070017
Bill Wendling7d623452015-03-18 13:36:07 -070018Introduction
19============
20
Bill Wendling5632e672015-03-29 17:06:07 -070021Most of the current formatters for Python --- e.g., autopep8, and pep8ify ---
22are made to remove lint errors from code. This has some obvious limitations.
23For instance, code that conforms to the PEP 8 guidelines may not be
24reformatted. But it doesn't mean that the code looks good.
Bill Wendling7d623452015-03-18 13:36:07 -070025
26YAPF takes a different approach. It's based off of 'clang-format', developed by
27Daniel Jasper. In essence, the algorithm takes the code and reformats it to the
28best formatting that conforms to the style guide, even if the original code
Peter Bengtsson1c60ad72015-03-24 20:05:39 -070029didn't violate the style guide. The idea is also similar to the 'gofmt' tool for
Eli Bendersky07072f82015-03-23 06:41:14 -070030the Go programming language: end all holy wars about formatting - if the whole
31code base of a project is simply piped through YAPF whenever modifications are
32made, the style remains consistent throughout the project and there's no point
33arguing about style in every code review.
Bill Wendling7d623452015-03-18 13:36:07 -070034
35The ultimate goal is that the code YAPF produces is as good as the code that a
Bill Wendling8fb9c482015-03-29 17:32:07 -070036programmer would write if they were following the style guide. It takes away
37some of the drudgery of maintaining your code.
Bill Wendling7d623452015-03-18 13:36:07 -070038
Bill Wendlingf5e50b62015-03-28 23:38:12 -070039.. footer::
Bill Wendling52e04112015-03-18 20:42:26 -070040
41 YAPF is not an official Google product (experimental or otherwise), it is
42 just code that happens to be owned by Google.
43
Bill Wendling7d623452015-03-18 13:36:07 -070044.. contents::
45
Bill Wendlingf09121c2015-10-20 22:59:33 -070046
Bill Wendling7d623452015-03-18 13:36:07 -070047Installation
48============
49
Bill Wendling6e8ca7b2015-10-25 01:16:43 -070050To install YAPF from PyPI:
51
52.. code-block:: shell
Eli Bendersky8a365362015-03-25 18:42:22 -070053
Eli Benderskye0e83c12015-04-06 20:23:30 -070054 $ pip install yapf
55
56YAPF is still considered in "alpha" stage, and the released version may change
57often; therefore, the best way to keep up-to-date with the latest development
58is to clone this repository.
59
60Note that if you intend to use YAPF as a command-line tool rather than as a
61library, installation is not necessary. YAPF supports being run as a directory
62by the Python interpreter. If you cloned/unzipped YAPF into ``DIR``, it's
Bill Wendling6e8ca7b2015-10-25 01:16:43 -070063possible to run:
64
65.. code-block:: shell
Eli Bendersky07072f82015-03-23 06:41:14 -070066
Eli Benderskyb3678b32015-03-25 14:16:11 -070067 $ PYTHONPATH=DIR python DIR/yapf [options] ...
Eli Bendersky07072f82015-03-23 06:41:14 -070068
Bill Wendlingf09121c2015-10-20 22:59:33 -070069
Eli Bendersky5eb88232015-03-27 06:27:11 -070070Python versions
71===============
72
Eli Benderskya7bfe7e2015-04-05 06:33:18 -070073YAPF supports Python 2.7 and 3.4.1+.
Eli Bendersky5eb88232015-03-27 06:27:11 -070074
75YAPF requires the code it formats to be valid Python for the version YAPF itself
76runs under. Therefore, if you format Python 3 code with YAPF, run YAPF itself
77under Python 3 (and similarly for Python 2).
78
Bill Wendlingf09121c2015-10-20 22:59:33 -070079
Bill Wendling7d623452015-03-18 13:36:07 -070080Usage
81=====
82
Bill Wendlingfa22c892015-03-18 13:42:25 -070083Options::
Bill Wendling7d623452015-03-18 13:36:07 -070084
Bill Wendlingf09121c2015-10-20 22:59:33 -070085 usage: yapf [-h] [-v] [-d | -i] [-r | -l START-END] [-e PATTERN]
86 [--style STYLE] [--style-help] [--no-local-style]
87 [--verify]
88 [files [files ...]]
Bill Wendling7d623452015-03-18 13:36:07 -070089
Bill Wendlingfa22c892015-03-18 13:42:25 -070090 Formatter for Python code.
Bill Wendling7d623452015-03-18 13:36:07 -070091
Bill Wendlingfa22c892015-03-18 13:42:25 -070092 positional arguments:
93 files
94
95 optional arguments:
96 -h, --help show this help message and exit
Bill Wendlingf09121c2015-10-20 22:59:33 -070097 -v, --version show version number and exit
98 -d, --diff print the diff for the fixed source
99 -i, --in-place make changes to files in place
100 -r, --recursive run recursively over directories
101 -l START-END, --lines START-END
102 range of lines to reformat, one-based
103 -e PATTERN, --exclude PATTERN
104 patterns for files to exclude from formatting
Eli Bendersky83d2bd02015-03-23 06:33:48 -0700105 --style STYLE specify formatting style: either a style name (for
106 example "pep8" or "google"), or the name of a file
Sam Clegg5170c3a2015-04-16 12:18:58 -0700107 with style settings. The default is pep8 unless a
Bill Wendling6e8ca7b2015-10-25 01:16:43 -0700108 .style.yapf or setup.cfg file located in one of the
109 parent directories of the source file (or current
110 directory for stdin)
Bill Wendlingf09121c2015-10-20 22:59:33 -0700111 --style-help show style settings and exit
112 --no-local-style don't search for local style definition (.style.yapf)
113 --verify try to verify reformatted code for syntax errors
114
Bill Wendling7d623452015-03-18 13:36:07 -0700115
Eli Bendersky83d2bd02015-03-23 06:33:48 -0700116Formatting style
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700117================
Eli Bendersky83d2bd02015-03-23 06:33:48 -0700118
119The formatting style used by YAPF is configurable and there are many "knobs"
120that can be used to tune how YAPF does formatting. See the ``style.py`` module
121for the full list.
122
Bill Wendlingc0167792015-04-02 01:58:39 -0700123To control the style, run YAPF with the ``--style`` argument. It accepts one of
124the predefined styles (e.g., ``pep8`` or ``google``), a path to a configuration
125file that specifies the desired style, or a dictionary of key/value pairs.
126
127The config file is a simple listing of (case-insensitive) ``key = value`` pairs
Bill Wendling6e8ca7b2015-10-25 01:16:43 -0700128with a ``[style]`` heading. For example:
129
130.. code-block:: guess
Eli Bendersky83d2bd02015-03-23 06:33:48 -0700131
132 [style]
133 based_on_style = pep8
134 spaces_before_comment = 4
135 split_before_logical_operator = true
136
137The ``based_on_style`` setting determines which of the predefined styles this
138custom style is based on (think of it like subclassing).
Bill Wendling7d623452015-03-18 13:36:07 -0700139
Bill Wendlingc0167792015-04-02 01:58:39 -0700140It's also possible to do the same on the command line with a dictionary. For
Bill Wendling6e8ca7b2015-10-25 01:16:43 -0700141example:
142
143.. code-block:: guess
Bill Wendlingc0167792015-04-02 01:58:39 -0700144
Bill Wendlingf09121c2015-10-20 22:59:33 -0700145 --style='{based_on_style: chromium, indent_width: 4}'
Bill Wendlingc0167792015-04-02 01:58:39 -0700146
Bill Wendlingf09121c2015-10-20 22:59:33 -0700147This will take the ``chromium`` base style and modify it to have four space
Bill Wendlingc0167792015-04-02 01:58:39 -0700148indentations.
149
Bill Wendling169790e2015-10-25 03:13:13 -0700150YAPF will search for the formatting style in the following manner:
151
1521. Specified on the command line
Joshua Moravecd8d15af2015-11-05 13:16:46 -06001532. In the `[style]` section of a `.style.yapf` file in either the current
Bill Wendling169790e2015-10-25 03:13:13 -0700154 directory or one of its parent directories.
1553. In the `[yapf]` secionf of a `setup.cfg` file in either the current
156 directory or one of its parent directories.
1574. In the `~/.config/yapf/style` file in your home directory.
158
159If none of those files are found, the default style is used (PEP8).
160
Bill Wendlingf09121c2015-10-20 22:59:33 -0700161
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700162Example
163=======
164
Sam Clegg4357fa32015-04-08 12:21:46 -0700165An example of the type of formatting that YAPF can do, it will take this ugly
166code:
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700167
168.. code-block:: python
169
170 x = { 'a':37,'b':42,
171
172 'c':927}
173
174 y = 'hello ''world'
175 z = 'hello '+'world'
176 a = 'hello {}'.format('world')
177 class foo ( object ):
178 def f (self ):
179 return 37*-+2
180 def g(self, x,y=42):
181 return y
182 def f ( a ) :
183 return 37+-+a[42-x : y**3]
184
Bill Wendling8fb9c482015-03-29 17:32:07 -0700185and reformat it into:
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700186
187.. code-block:: python
188
189 x = {'a': 37, 'b': 42, 'c': 927}
190
191 y = 'hello ' 'world'
192 z = 'hello ' + 'world'
193 a = 'hello {}'.format('world')
194
195
196 class foo(object):
Bill Wendling5632e672015-03-29 17:06:07 -0700197 def f(self):
198 return 37 * -+2
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700199
Bill Wendling5632e672015-03-29 17:06:07 -0700200 def g(self, x, y=42):
201 return y
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700202
203
204 def f(a):
Bill Wendling8d8f5122015-10-16 11:46:23 -0700205 return 37 + -+a[42 - x:y**3]
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700206
Bill Wendlingf09121c2015-10-20 22:59:33 -0700207
Andy Haydena00a6bf2015-06-15 18:47:41 -0700208Example as a module
209===================
210
Andy Hayden4af71682015-06-17 15:42:43 -0700211The two main APIs for calling yapf are ``FormatCode`` and ``FormatFile``, these
212share several arguments which are described below:
Andy Haydena00a6bf2015-06-15 18:47:41 -0700213
214.. code-block:: python
215
Andy Hayden4af71682015-06-17 15:42:43 -0700216 >>> from yapf.yapf_api import FormatCode # reformat a string of code
Ɓukasz Langa94089872015-09-22 16:02:26 -0700217
Andy Haydena00a6bf2015-06-15 18:47:41 -0700218 >>> FormatCode("f ( a = 1, b = 2 )")
219 'f(a=1, b=2)\n'
220
Andy Hayden4af71682015-06-17 15:42:43 -0700221A ``style_config`` argument: Either a style name or a path to a file that contains
Andy Haydena00a6bf2015-06-15 18:47:41 -0700222formatting style settings. If None is specified, use the default style
223as set in ``style.DEFAULT_STYLE_FACTORY``.
224
225.. code-block:: python
226
227 >>> FormatCode("def g():\n return True", style_config='pep8')
228 'def g():\n return True\n'
229
Andy Haydena00a6bf2015-06-15 18:47:41 -0700230A ``lines`` argument: A list of tuples of lines (ints), [start, end],
231that we want to format. The lines are 1-based indexed. It can be used by
232third-party code (e.g., IDEs) when reformatting a snippet of code rather
233than a whole file.
234
235.. code-block:: python
236
237 >>> FormatCode("def g( ):\n a=1\n b = 2\n return a==b", lines=[(1, 1), (2, 3)])
238 'def g():\n a = 1\n b = 2\n return a==b\n'
239
240A ``print_diff`` (bool): Instead of returning the reformatted source, return a
241diff that turns the formatted source into reformatter source.
242
243.. code-block:: python
244
245 >>> print(FormatCode("a==b", filename="foo.py", print_diff=True))
Bill Wendlingb8645ea2015-06-30 22:27:56 -0700246 --- foo.py (original)
247 +++ foo.py (reformatted)
Andy Haydena00a6bf2015-06-15 18:47:41 -0700248 @@ -1 +1 @@
249 -a==b
250 +a == b
251
Andy Hayden4af71682015-06-17 15:42:43 -0700252Note: the ``filename`` argument for ``FormatCode`` is what is inserted into
253the diff, the default is ``<unknown>``.
Andy Haydena00a6bf2015-06-15 18:47:41 -0700254
255``FormatFile`` returns reformatted code from the passed file along with its encoding:
256
257.. code-block:: python
258
Andy Hayden4af71682015-06-17 15:42:43 -0700259 >>> from yapf.yapf_api import FormatFile # reformat a file
260
Andy Haydena00a6bf2015-06-15 18:47:41 -0700261 >>> print(open("foo.py").read()) # contents of file
262 a==b
263
264 >>> FormatFile("foo.py")
Andy Hayden4af71682015-06-17 15:42:43 -0700265 ('a == b\n', 'utf-8')
266
Bill Wendlingcfbb1242015-09-20 12:08:18 -0700267The ``in-place`` argument saves the reformatted code back to the file:
Andy Hayden4af71682015-06-17 15:42:43 -0700268
269.. code-block:: python
270
271 >>> FormatFile("foo.py", in_place=True)
272 (None, 'utf-8')
273
274 >>> print(open("foo.py").read()) # contents of file (now fixed)
275 a == b
276
Andy Haydena00a6bf2015-06-15 18:47:41 -0700277
Bill Wendlingf09121c2015-10-20 22:59:33 -0700278Knobs
279=====
280
281``ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT``
282 Align closing bracket with visual indentation.
283
284``BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF``
285 Insert a blank line before a 'def' or 'class' immediately nested
286 within another 'def' or 'class'.
287
288 For example:
289
Alfie Bowmand1ae8a82015-10-21 12:30:43 +0100290.. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700291
292 class Foo:
293 # <------ this blank line
294 def method():
295 pass
296
297``COLUMN_LIMIT``
James Broadheadf4dd8042016-01-07 14:40:19 +0000298 The column limit (or max line-length)
Bill Wendlingf09121c2015-10-20 22:59:33 -0700299
300``CONTINUATION_INDENT_WIDTH``
301 Indent width used for line continuations.
302
303``DEDENT_CLOSING_BRACKETS``
304 Put closing brackets on a separate line, dedented, if the bracketed
305 expression can't fit in a single line. Applies to all kinds of brackets,
306 including function definitions and calls.
307
308 For example:
309
Alfie Bowmand1ae8a82015-10-21 12:30:43 +0100310.. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700311
312 config = {
313 'key1': 'value1',
314 'key2': 'value2',
315 } # <--- this bracket is dedented and on a separate line
316
317 time_series = self.remote_client.query_entity_counters(
318 entity='dev3246.region1',
319 key='dns.query_latency_tcp',
320 transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
321 start_ts=now()-timedelta(days=3),
322 end_ts=now(),
323 ) # <--- this bracket is dedented and on a separate line
324
325``I18N_COMMENT``
326 The regex for an internationalization comment. The presence of this comment
327 stops reformatting of that line, because the comments are required to be
328 next to the string they translate.
329
330``I18N_FUNCTION_CALL``
331 The internationalization function call names. The presence of this
332 function stops reformattting on that line, because the string it has
333 cannot be moved away from the i18n comment.
334
335``INDENT_DICTIONARY_VALUE``
336 Indent the dictionary value if it cannot fit on the same line as the
337 dictionary key.
338
339 For example:
340
Alfie Bowmand1ae8a82015-10-21 12:30:43 +0100341.. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700342
343 config = {
344 'key1':
345 'value1',
346 'key2': value1 +
347 value2,
348 }
349
350``INDENT_WIDTH``
351 The number of columns to use for indentation.
352
353``JOIN_MULTIPLE_LINES``
354 Join short lines into one line. E.g., single line ``if`` statements.
355
356``SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET``
357 Insert a space between the ending comma and closing bracket of a list,
358 etc.
359
Bill Wendling9dc79082016-05-10 00:23:53 -0700360``SPACES_AROUND_POWER_OPERATOR``
361 Set to ``True`` to prefer using spaces around ``**``.
362
Bill Wendlingf09121c2015-10-20 22:59:33 -0700363``SPACES_BEFORE_COMMENT``
364 The number of spaces required before a trailing comment.
365
366``SPLIT_BEFORE_BITWISE_OPERATOR``
367 Set to ``True`` to prefer splitting before ``&``, ``|`` or ``^`` rather
368 than after.
369
370``SPLIT_BEFORE_LOGICAL_OPERATOR``
371 Set to ``True`` to prefer splitting before ``and`` or ``or`` rather than
372 after.
373
374``SPLIT_BEFORE_NAMED_ASSIGNS``
375 Split named assignments onto individual lines.
376
377``SPLIT_PENALTY_AFTER_OPENING_BRACKET``
378 The penalty for splitting right after the opening bracket.
379
380``SPLIT_PENALTY_AFTER_UNARY_OPERATOR``
381 The penalty for splitting the line after a unary operator.
382
383``SPLIT_PENALTY_BITWISE_OPERATOR``
384 The penalty of splitting the line around the ``&``, ``|``, and ``^``
385 operators.
386
387``SPLIT_PENALTY_EXCESS_CHARACTER``
388 The penalty for characters over the column limit.
389
390``SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT``
391 The penalty incurred by adding a line split to the unwrapped line. The
392 more line splits added the higher the penalty.
393
394``SPLIT_PENALTY_IMPORT_NAMES``
395 The penalty of splitting a list of ``import as`` names.
396
397 For example:
398
Alfie Bowmand1ae8a82015-10-21 12:30:43 +0100399.. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700400
401 from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
402 long_argument_2,
403 long_argument_3)
404
405 would reformat to something like:
406
Alfie Bowmand1ae8a82015-10-21 12:30:43 +0100407.. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700408
409 from a_very_long_or_indented_module_name_yada_yad import (
410 long_argument_1, long_argument_2, long_argument_3)
411
412``SPLIT_PENALTY_LOGICAL_OPERATOR``
413 The penalty of splitting the line around the ``and`` and ``or`` operators.
414
415
Bill Wendling8fb9c482015-03-29 17:32:07 -0700416(Potentially) Frequently Asked Questions
417========================================
418
419Why does YAPF destroy my awesome formatting?
420--------------------------------------------
421
422YAPF tries very hard to get the formatting correct. But for some code, it won't
423be as good as hand-formatting. In particular, large data literals may become
424horribly disfigured under YAPF.
425
Diogo Moitinho de Almeida24458d02015-04-02 17:57:22 -0700426The reason for this is many-fold. But in essence YAPF is simply a tool to help
Bill Wendling8fb9c482015-03-29 17:32:07 -0700427with development. It will format things to coincide with the style guide, but
428that may not equate with readability.
429
430What can be done to alleviate this situation is to indicate regions YAPF should
431ignore when reformatting something:
432
433.. code-block:: python
434
435 # yapf: disable
436 FOO = {
437 # ... some very large, complex data literal.
438 }
439
440 BAR = [
441 # ... another large data literal.
442 ]
443 # yapf: enable
444
445You can also disable formatting for a single literal like this:
446
447.. code-block:: python
448
449 BAZ = {
Scott Sandersoneda4e262015-07-05 21:10:06 -0400450 (1, 2, 3, 4),
451 (5, 6, 7, 8),
452 (9, 10, 11, 12),
Bill Wendling8fb9c482015-03-29 17:32:07 -0700453 } # yapf: disable
454
Ɓukasz Langa94089872015-09-22 16:02:26 -0700455To preserve the nice dedented closing brackets, use the
456``dedent_closing_brackets`` in your style. Note that in this case all
457brackets, including function definitions and calls, are going to use
458that style. This provides consistency across the formatted codebase.
459
Bill Wendling7d623452015-03-18 13:36:07 -0700460Why Not Improve Existing Tools?
Bill Wendling8fb9c482015-03-29 17:32:07 -0700461-------------------------------
Bill Wendling7d623452015-03-18 13:36:07 -0700462
463We wanted to use clang-format's reformatting algorithm. It's very powerful and
464designed to come up with the best formatting possible. Existing tools were
465created with different goals in mind, and would require extensive modifications
466to convert to using clang-format's algorithm.
467
Bill Wendling7d623452015-03-18 13:36:07 -0700468Can I Use YAPF In My Program?
Bill Wendling8fb9c482015-03-29 17:32:07 -0700469-----------------------------
Bill Wendling7d623452015-03-18 13:36:07 -0700470
471Please do! YAPF was designed to be used as a library as well as a command line
472tool. This means that a tool or IDE plugin is free to use YAPF.
473
Bill Wendlingf09121c2015-10-20 22:59:33 -0700474
Bill Wendling7d623452015-03-18 13:36:07 -0700475Gory Details
476============
477
478Algorithm Design
479----------------
480
Eli Benderskyd08130d2015-03-19 05:20:46 -0700481The main data structure in YAPF is the ``UnwrappedLine`` object. It holds a list
482of ``FormatToken``\s, that we would want to place on a single line if there were
483no column limit. An exception being a comment in the middle of an expression
Bill Wendling7d623452015-03-18 13:36:07 -0700484statement will force the line to be formatted on more than one line. The
Eli Benderskyd08130d2015-03-19 05:20:46 -0700485formatter works on one ``UnwrappedLine`` object at a time.
Bill Wendling7d623452015-03-18 13:36:07 -0700486
Eli Benderskyd08130d2015-03-19 05:20:46 -0700487An ``UnwrappedLine`` typically won't affect the formatting of lines before or
488after it. There is a part of the algorithm that may join two or more
489``UnwrappedLine``\s into one line. For instance, an if-then statement with a
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700490short body can be placed on a single line:
491
492.. code-block:: python
Bill Wendling7d623452015-03-18 13:36:07 -0700493
494 if a == 42: continue
495
496YAPF's formatting algorithm creates a weighted tree that acts as the solution
497space for the algorithm. Each node in the tree represents the result of a
498formatting decision --- i.e., whether to split or not to split before a token.
499Each formatting decision has a cost associated with it. Therefore, the cost is
500realized on the edge between two nodes. (In reality, the weighted tree doesn't
501have separate edge objects, so the cost resides on the nodes themselves.)
502
503For example, take the following Python code snippet. For the sake of this
504example, assume that line (1) violates the column limit restriction and needs to
505be reformatted.
506
Bill Wendlingfa22c892015-03-18 13:42:25 -0700507.. code-block:: python
Bill Wendling7d623452015-03-18 13:36:07 -0700508
Bill Wendlingfa22c892015-03-18 13:42:25 -0700509 def xxxxxxxxxxx(aaaaaaaaaaaa, bbbbbbbbb, cccccccc, dddddddd, eeeeee): # 1
510 pass # 2
Bill Wendling7d623452015-03-18 13:36:07 -0700511
512For line (1), the algorithm will build a tree where each node (a
Eli Benderskyd08130d2015-03-19 05:20:46 -0700513``FormattingDecisionState`` object) is the state of the line at that token given
514the decision to split before the token or not. Note: the ``FormatDecisionState``
515objects are copied by value so each node in the graph is unique and a change in
516one doesn't affect other nodes.
Bill Wendling7d623452015-03-18 13:36:07 -0700517
Bill Wendlingfa22c892015-03-18 13:42:25 -0700518Heuristics are used to determine the costs of splitting or not splitting.
519Because a node holds the state of the tree up to a token's insertion, it can
520easily determine if a splitting decision will violate one of the style
Bill Wendling7d623452015-03-18 13:36:07 -0700521requirements. For instance, the heuristic is able to apply an extra penalty to
522the edge when not splitting between the previous token and the one being added.
523
524There are some instances where we will never want to split the line, because
525doing so will always be detrimental (i.e., it will require a backslash-newline,
526which is very rarely desirable). For line (1), we will never want to split the
Eli Benderskyd08130d2015-03-19 05:20:46 -0700527first three tokens: ``def``, ``xxxxxxxxxxx``, and ``(``. Nor will we want to
528split between the ``)`` and the ``:`` at the end. These regions are said to be
529"unbreakable." This is reflected in the tree by there not being a "split"
Bill Wendling7d623452015-03-18 13:36:07 -0700530decision (left hand branch) within the unbreakable region.
531
532Now that we have the tree, we determine what the "best" formatting is by finding
533the path through the tree with the lowest cost.
534
535And that's it!