blob: 3894b4a7bc7fff55159262f2bb4dc529fcf96f0c [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]
Bill Wendlingf09121c2015-10-20 22:59:33 -070087 [files [files ...]]
Bill Wendling7d623452015-03-18 13:36:07 -070088
Bill Wendlingfa22c892015-03-18 13:42:25 -070089 Formatter for Python code.
Bill Wendling7d623452015-03-18 13:36:07 -070090
Bill Wendlingfa22c892015-03-18 13:42:25 -070091 positional arguments:
92 files
93
94 optional arguments:
95 -h, --help show this help message and exit
Bill Wendlingf09121c2015-10-20 22:59:33 -070096 -v, --version show version number and exit
97 -d, --diff print the diff for the fixed source
98 -i, --in-place make changes to files in place
99 -r, --recursive run recursively over directories
100 -l START-END, --lines START-END
101 range of lines to reformat, one-based
102 -e PATTERN, --exclude PATTERN
103 patterns for files to exclude from formatting
Eli Bendersky83d2bd02015-03-23 06:33:48 -0700104 --style STYLE specify formatting style: either a style name (for
105 example "pep8" or "google"), or the name of a file
Sam Clegg5170c3a2015-04-16 12:18:58 -0700106 with style settings. The default is pep8 unless a
Bill Wendling6e8ca7b2015-10-25 01:16:43 -0700107 .style.yapf or setup.cfg file located in one of the
108 parent directories of the source file (or current
109 directory for stdin)
Bill Wendlingf09121c2015-10-20 22:59:33 -0700110 --style-help show style settings and exit
111 --no-local-style don't search for local style definition (.style.yapf)
Bill Wendlingf09121c2015-10-20 22:59:33 -0700112
Bill Wendling7d623452015-03-18 13:36:07 -0700113
Eli Bendersky83d2bd02015-03-23 06:33:48 -0700114Formatting style
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700115================
Eli Bendersky83d2bd02015-03-23 06:33:48 -0700116
117The formatting style used by YAPF is configurable and there are many "knobs"
118that can be used to tune how YAPF does formatting. See the ``style.py`` module
119for the full list.
120
Bill Wendlingc0167792015-04-02 01:58:39 -0700121To control the style, run YAPF with the ``--style`` argument. It accepts one of
122the predefined styles (e.g., ``pep8`` or ``google``), a path to a configuration
123file that specifies the desired style, or a dictionary of key/value pairs.
124
125The config file is a simple listing of (case-insensitive) ``key = value`` pairs
Bill Wendling6e8ca7b2015-10-25 01:16:43 -0700126with a ``[style]`` heading. For example:
127
128.. code-block:: guess
Eli Bendersky83d2bd02015-03-23 06:33:48 -0700129
130 [style]
131 based_on_style = pep8
132 spaces_before_comment = 4
133 split_before_logical_operator = true
134
135The ``based_on_style`` setting determines which of the predefined styles this
136custom style is based on (think of it like subclassing).
Bill Wendling7d623452015-03-18 13:36:07 -0700137
Bill Wendlingc0167792015-04-02 01:58:39 -0700138It's also possible to do the same on the command line with a dictionary. For
Bill Wendling6e8ca7b2015-10-25 01:16:43 -0700139example:
140
141.. code-block:: guess
Bill Wendlingc0167792015-04-02 01:58:39 -0700142
Bill Wendlingf09121c2015-10-20 22:59:33 -0700143 --style='{based_on_style: chromium, indent_width: 4}'
Bill Wendlingc0167792015-04-02 01:58:39 -0700144
Bill Wendlingf09121c2015-10-20 22:59:33 -0700145This will take the ``chromium`` base style and modify it to have four space
Bill Wendlingc0167792015-04-02 01:58:39 -0700146indentations.
147
Bill Wendling169790e2015-10-25 03:13:13 -0700148YAPF will search for the formatting style in the following manner:
149
1501. Specified on the command line
Joshua Moravecd8d15af2015-11-05 13:16:46 -06001512. In the `[style]` section of a `.style.yapf` file in either the current
Bill Wendling169790e2015-10-25 03:13:13 -0700152 directory or one of its parent directories.
Bill Wendling821a36f2016-07-13 23:02:16 -07001533. In the `[yapf]` section of a `setup.cfg` file in either the current
Bill Wendling169790e2015-10-25 03:13:13 -0700154 directory or one of its parent directories.
1554. In the `~/.config/yapf/style` file in your home directory.
156
157If none of those files are found, the default style is used (PEP8).
158
Bill Wendlingf09121c2015-10-20 22:59:33 -0700159
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700160Example
161=======
162
Sam Clegg4357fa32015-04-08 12:21:46 -0700163An example of the type of formatting that YAPF can do, it will take this ugly
164code:
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700165
166.. code-block:: python
167
168 x = { 'a':37,'b':42,
169
170 'c':927}
171
172 y = 'hello ''world'
173 z = 'hello '+'world'
174 a = 'hello {}'.format('world')
175 class foo ( object ):
176 def f (self ):
177 return 37*-+2
178 def g(self, x,y=42):
179 return y
180 def f ( a ) :
181 return 37+-+a[42-x : y**3]
182
Bill Wendling8fb9c482015-03-29 17:32:07 -0700183and reformat it into:
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700184
185.. code-block:: python
186
187 x = {'a': 37, 'b': 42, 'c': 927}
188
189 y = 'hello ' 'world'
190 z = 'hello ' + 'world'
191 a = 'hello {}'.format('world')
192
193
194 class foo(object):
Bill Wendling5632e672015-03-29 17:06:07 -0700195 def f(self):
196 return 37 * -+2
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700197
Bill Wendling5632e672015-03-29 17:06:07 -0700198 def g(self, x, y=42):
199 return y
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700200
201
202 def f(a):
Bill Wendling8d8f5122015-10-16 11:46:23 -0700203 return 37 + -+a[42 - x:y**3]
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700204
Bill Wendlingf09121c2015-10-20 22:59:33 -0700205
Andy Haydena00a6bf2015-06-15 18:47:41 -0700206Example as a module
207===================
208
Andy Hayden4af71682015-06-17 15:42:43 -0700209The two main APIs for calling yapf are ``FormatCode`` and ``FormatFile``, these
210share several arguments which are described below:
Andy Haydena00a6bf2015-06-15 18:47:41 -0700211
212.. code-block:: python
213
Andy Hayden4af71682015-06-17 15:42:43 -0700214 >>> from yapf.yapf_api import FormatCode # reformat a string of code
Ɓukasz Langa94089872015-09-22 16:02:26 -0700215
Andy Haydena00a6bf2015-06-15 18:47:41 -0700216 >>> FormatCode("f ( a = 1, b = 2 )")
217 'f(a=1, b=2)\n'
218
Andy Hayden4af71682015-06-17 15:42:43 -0700219A ``style_config`` argument: Either a style name or a path to a file that contains
Andy Haydena00a6bf2015-06-15 18:47:41 -0700220formatting style settings. If None is specified, use the default style
221as set in ``style.DEFAULT_STYLE_FACTORY``.
222
223.. code-block:: python
224
225 >>> FormatCode("def g():\n return True", style_config='pep8')
226 'def g():\n return True\n'
227
Andy Haydena00a6bf2015-06-15 18:47:41 -0700228A ``lines`` argument: A list of tuples of lines (ints), [start, end],
229that we want to format. The lines are 1-based indexed. It can be used by
230third-party code (e.g., IDEs) when reformatting a snippet of code rather
231than a whole file.
232
233.. code-block:: python
234
235 >>> FormatCode("def g( ):\n a=1\n b = 2\n return a==b", lines=[(1, 1), (2, 3)])
236 'def g():\n a = 1\n b = 2\n return a==b\n'
237
238A ``print_diff`` (bool): Instead of returning the reformatted source, return a
239diff that turns the formatted source into reformatter source.
240
241.. code-block:: python
242
243 >>> print(FormatCode("a==b", filename="foo.py", print_diff=True))
Bill Wendlingb8645ea2015-06-30 22:27:56 -0700244 --- foo.py (original)
245 +++ foo.py (reformatted)
Andy Haydena00a6bf2015-06-15 18:47:41 -0700246 @@ -1 +1 @@
247 -a==b
248 +a == b
249
Andy Hayden4af71682015-06-17 15:42:43 -0700250Note: the ``filename`` argument for ``FormatCode`` is what is inserted into
251the diff, the default is ``<unknown>``.
Andy Haydena00a6bf2015-06-15 18:47:41 -0700252
253``FormatFile`` returns reformatted code from the passed file along with its encoding:
254
255.. code-block:: python
256
Andy Hayden4af71682015-06-17 15:42:43 -0700257 >>> from yapf.yapf_api import FormatFile # reformat a file
258
Andy Haydena00a6bf2015-06-15 18:47:41 -0700259 >>> print(open("foo.py").read()) # contents of file
260 a==b
261
262 >>> FormatFile("foo.py")
Andy Hayden4af71682015-06-17 15:42:43 -0700263 ('a == b\n', 'utf-8')
264
Bill Wendlingcfbb1242015-09-20 12:08:18 -0700265The ``in-place`` argument saves the reformatted code back to the file:
Andy Hayden4af71682015-06-17 15:42:43 -0700266
267.. code-block:: python
268
269 >>> FormatFile("foo.py", in_place=True)
270 (None, 'utf-8')
271
272 >>> print(open("foo.py").read()) # contents of file (now fixed)
273 a == b
274
Andy Haydena00a6bf2015-06-15 18:47:41 -0700275
Bill Wendlingf09121c2015-10-20 22:59:33 -0700276Knobs
277=====
278
279``ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT``
280 Align closing bracket with visual indentation.
281
Bill Wendling996c3ee2016-05-25 23:52:24 -0700282``ALLOW_MULTILINE_LAMBDAS``
283 Allow lambdas to be formatted on more than one line.
284
Bill Wendlingf09121c2015-10-20 22:59:33 -0700285``BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF``
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700286 Insert a blank line before a ``def`` or ``class`` immediately nested within
Bill Wendling996c3ee2016-05-25 23:52:24 -0700287 another ``def`` or ``class``. For example:
Bill Wendlingf09121c2015-10-20 22:59:33 -0700288
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700289 .. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700290
291 class Foo:
292 # <------ this blank line
293 def method():
294 pass
295
Ben Plotnick7e088292016-06-09 18:29:56 -0700296``COALESCE_BRACKETS``
297 Do not split consecutive brackets. Only relevant when
298 ``DEDENT_CLOSING_BRACKETS`` is set. For example:
299
300 .. code-block:: python
301
302 call_func_that_takes_a_dict(
303 {
304 'key1': 'value1',
305 'key2': 'value2',
306 }
307 )
308
309 would reformat to:
310
311 .. code-block:: python
312
313 call_func_that_takes_a_dict({
314 'key1': 'value1',
315 'key2': 'value2',
316 })
317
318
Bill Wendlingf09121c2015-10-20 22:59:33 -0700319``COLUMN_LIMIT``
James Broadheadf4dd8042016-01-07 14:40:19 +0000320 The column limit (or max line-length)
Bill Wendlingf09121c2015-10-20 22:59:33 -0700321
322``CONTINUATION_INDENT_WIDTH``
323 Indent width used for line continuations.
324
325``DEDENT_CLOSING_BRACKETS``
326 Put closing brackets on a separate line, dedented, if the bracketed
327 expression can't fit in a single line. Applies to all kinds of brackets,
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700328 including function definitions and calls. For example:
Bill Wendlingf09121c2015-10-20 22:59:33 -0700329
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700330 .. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700331
332 config = {
333 'key1': 'value1',
334 'key2': 'value2',
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700335 } # <--- this bracket is dedented and on a separate line
Bill Wendlingf09121c2015-10-20 22:59:33 -0700336
337 time_series = self.remote_client.query_entity_counters(
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700338 entity='dev3246.region1',
339 key='dns.query_latency_tcp',
340 transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
341 start_ts=now()-timedelta(days=3),
342 end_ts=now(),
343 ) # <--- this bracket is dedented and on a separate line
Bill Wendlingf09121c2015-10-20 22:59:33 -0700344
345``I18N_COMMENT``
346 The regex for an internationalization comment. The presence of this comment
347 stops reformatting of that line, because the comments are required to be
348 next to the string they translate.
349
350``I18N_FUNCTION_CALL``
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700351 The internationalization function call names. The presence of this function
352 stops reformattting on that line, because the string it has cannot be moved
353 away from the i18n comment.
Bill Wendlingf09121c2015-10-20 22:59:33 -0700354
355``INDENT_DICTIONARY_VALUE``
356 Indent the dictionary value if it cannot fit on the same line as the
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700357 dictionary key. For example:
Bill Wendlingf09121c2015-10-20 22:59:33 -0700358
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700359 .. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700360
361 config = {
362 'key1':
363 'value1',
364 'key2': value1 +
365 value2,
366 }
367
368``INDENT_WIDTH``
369 The number of columns to use for indentation.
370
371``JOIN_MULTIPLE_LINES``
372 Join short lines into one line. E.g., single line ``if`` statements.
373
Bill Wendling9dc79082016-05-10 00:23:53 -0700374``SPACES_AROUND_POWER_OPERATOR``
375 Set to ``True`` to prefer using spaces around ``**``.
376
Bill Wendlingf09121c2015-10-20 22:59:33 -0700377``SPACES_BEFORE_COMMENT``
378 The number of spaces required before a trailing comment.
379
Bill Wendling996c3ee2016-05-25 23:52:24 -0700380``SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET``
381 Insert a space between the ending comma and closing bracket of a list, etc.
382
Bill Wendling982c5b32016-05-24 00:47:44 -0700383``SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED``
384 Split before arguments if the argument list is terminated by a comma.
385
Bill Wendlingf09121c2015-10-20 22:59:33 -0700386``SPLIT_BEFORE_BITWISE_OPERATOR``
387 Set to ``True`` to prefer splitting before ``&``, ``|`` or ``^`` rather
388 than after.
389
Bill Wendling996c3ee2016-05-25 23:52:24 -0700390``SPLIT_BEFORE_FIRST_ARGUMENT``
391 If an argument / parameter list is going to be split, then split before the
392 first argument.
393
Bill Wendlingf09121c2015-10-20 22:59:33 -0700394``SPLIT_BEFORE_LOGICAL_OPERATOR``
395 Set to ``True`` to prefer splitting before ``and`` or ``or`` rather than
396 after.
397
398``SPLIT_BEFORE_NAMED_ASSIGNS``
399 Split named assignments onto individual lines.
400
401``SPLIT_PENALTY_AFTER_OPENING_BRACKET``
402 The penalty for splitting right after the opening bracket.
403
404``SPLIT_PENALTY_AFTER_UNARY_OPERATOR``
405 The penalty for splitting the line after a unary operator.
406
Bill Wendling996c3ee2016-05-25 23:52:24 -0700407``SPLIT_PENALTY_BEFORE_IF_EXPR``
408 The penalty for splitting right before an ``if`` expression.
409
Bill Wendlingf09121c2015-10-20 22:59:33 -0700410``SPLIT_PENALTY_BITWISE_OPERATOR``
411 The penalty of splitting the line around the ``&``, ``|``, and ``^``
412 operators.
413
414``SPLIT_PENALTY_EXCESS_CHARACTER``
415 The penalty for characters over the column limit.
416
417``SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT``
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700418 The penalty incurred by adding a line split to the unwrapped line. The more
419 line splits added the higher the penalty.
Bill Wendlingf09121c2015-10-20 22:59:33 -0700420
421``SPLIT_PENALTY_IMPORT_NAMES``
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700422 The penalty of splitting a list of ``import as`` names. For example:
Bill Wendlingf09121c2015-10-20 22:59:33 -0700423
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700424 .. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700425
426 from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
427 long_argument_2,
428 long_argument_3)
429
430 would reformat to something like:
431
Bill Wendlingc2a9e0d2016-05-24 20:51:04 -0700432 .. code-block:: python
Bill Wendlingf09121c2015-10-20 22:59:33 -0700433
434 from a_very_long_or_indented_module_name_yada_yad import (
435 long_argument_1, long_argument_2, long_argument_3)
436
437``SPLIT_PENALTY_LOGICAL_OPERATOR``
438 The penalty of splitting the line around the ``and`` and ``or`` operators.
439
Draconye582d632016-06-05 11:48:26 +0200440``USE_TABS``
441 Use the Tab character for indentation.
442
Bill Wendling8fb9c482015-03-29 17:32:07 -0700443(Potentially) Frequently Asked Questions
444========================================
445
446Why does YAPF destroy my awesome formatting?
447--------------------------------------------
448
449YAPF tries very hard to get the formatting correct. But for some code, it won't
450be as good as hand-formatting. In particular, large data literals may become
451horribly disfigured under YAPF.
452
Diogo Moitinho de Almeida24458d02015-04-02 17:57:22 -0700453The reason for this is many-fold. But in essence YAPF is simply a tool to help
Bill Wendling8fb9c482015-03-29 17:32:07 -0700454with development. It will format things to coincide with the style guide, but
455that may not equate with readability.
456
457What can be done to alleviate this situation is to indicate regions YAPF should
458ignore when reformatting something:
459
460.. code-block:: python
461
462 # yapf: disable
463 FOO = {
464 # ... some very large, complex data literal.
465 }
466
467 BAR = [
468 # ... another large data literal.
469 ]
470 # yapf: enable
471
472You can also disable formatting for a single literal like this:
473
474.. code-block:: python
475
476 BAZ = {
Scott Sandersoneda4e262015-07-05 21:10:06 -0400477 (1, 2, 3, 4),
478 (5, 6, 7, 8),
479 (9, 10, 11, 12),
Bill Wendling8fb9c482015-03-29 17:32:07 -0700480 } # yapf: disable
481
Ɓukasz Langa94089872015-09-22 16:02:26 -0700482To preserve the nice dedented closing brackets, use the
483``dedent_closing_brackets`` in your style. Note that in this case all
484brackets, including function definitions and calls, are going to use
485that style. This provides consistency across the formatted codebase.
486
Bill Wendling7d623452015-03-18 13:36:07 -0700487Why Not Improve Existing Tools?
Bill Wendling8fb9c482015-03-29 17:32:07 -0700488-------------------------------
Bill Wendling7d623452015-03-18 13:36:07 -0700489
490We wanted to use clang-format's reformatting algorithm. It's very powerful and
491designed to come up with the best formatting possible. Existing tools were
492created with different goals in mind, and would require extensive modifications
493to convert to using clang-format's algorithm.
494
Bill Wendling7d623452015-03-18 13:36:07 -0700495Can I Use YAPF In My Program?
Bill Wendling8fb9c482015-03-29 17:32:07 -0700496-----------------------------
Bill Wendling7d623452015-03-18 13:36:07 -0700497
498Please do! YAPF was designed to be used as a library as well as a command line
499tool. This means that a tool or IDE plugin is free to use YAPF.
500
Bill Wendlingf09121c2015-10-20 22:59:33 -0700501
Bill Wendling7d623452015-03-18 13:36:07 -0700502Gory Details
503============
504
505Algorithm Design
506----------------
507
Eli Benderskyd08130d2015-03-19 05:20:46 -0700508The main data structure in YAPF is the ``UnwrappedLine`` object. It holds a list
509of ``FormatToken``\s, that we would want to place on a single line if there were
510no column limit. An exception being a comment in the middle of an expression
Bill Wendling7d623452015-03-18 13:36:07 -0700511statement will force the line to be formatted on more than one line. The
Eli Benderskyd08130d2015-03-19 05:20:46 -0700512formatter works on one ``UnwrappedLine`` object at a time.
Bill Wendling7d623452015-03-18 13:36:07 -0700513
Eli Benderskyd08130d2015-03-19 05:20:46 -0700514An ``UnwrappedLine`` typically won't affect the formatting of lines before or
515after it. There is a part of the algorithm that may join two or more
516``UnwrappedLine``\s into one line. For instance, an if-then statement with a
Bill Wendlingf5e50b62015-03-28 23:38:12 -0700517short body can be placed on a single line:
518
519.. code-block:: python
Bill Wendling7d623452015-03-18 13:36:07 -0700520
521 if a == 42: continue
522
523YAPF's formatting algorithm creates a weighted tree that acts as the solution
524space for the algorithm. Each node in the tree represents the result of a
525formatting decision --- i.e., whether to split or not to split before a token.
526Each formatting decision has a cost associated with it. Therefore, the cost is
527realized on the edge between two nodes. (In reality, the weighted tree doesn't
528have separate edge objects, so the cost resides on the nodes themselves.)
529
530For example, take the following Python code snippet. For the sake of this
531example, assume that line (1) violates the column limit restriction and needs to
532be reformatted.
533
Bill Wendlingfa22c892015-03-18 13:42:25 -0700534.. code-block:: python
Bill Wendling7d623452015-03-18 13:36:07 -0700535
Bill Wendlingfa22c892015-03-18 13:42:25 -0700536 def xxxxxxxxxxx(aaaaaaaaaaaa, bbbbbbbbb, cccccccc, dddddddd, eeeeee): # 1
537 pass # 2
Bill Wendling7d623452015-03-18 13:36:07 -0700538
539For line (1), the algorithm will build a tree where each node (a
Eli Benderskyd08130d2015-03-19 05:20:46 -0700540``FormattingDecisionState`` object) is the state of the line at that token given
541the decision to split before the token or not. Note: the ``FormatDecisionState``
542objects are copied by value so each node in the graph is unique and a change in
543one doesn't affect other nodes.
Bill Wendling7d623452015-03-18 13:36:07 -0700544
Bill Wendlingfa22c892015-03-18 13:42:25 -0700545Heuristics are used to determine the costs of splitting or not splitting.
546Because a node holds the state of the tree up to a token's insertion, it can
547easily determine if a splitting decision will violate one of the style
Bill Wendling7d623452015-03-18 13:36:07 -0700548requirements. For instance, the heuristic is able to apply an extra penalty to
549the edge when not splitting between the previous token and the one being added.
550
551There are some instances where we will never want to split the line, because
552doing so will always be detrimental (i.e., it will require a backslash-newline,
553which is very rarely desirable). For line (1), we will never want to split the
Eli Benderskyd08130d2015-03-19 05:20:46 -0700554first three tokens: ``def``, ``xxxxxxxxxxx``, and ``(``. Nor will we want to
555split between the ``)`` and the ``:`` at the end. These regions are said to be
556"unbreakable." This is reflected in the tree by there not being a "split"
Bill Wendling7d623452015-03-18 13:36:07 -0700557decision (left hand branch) within the unbreakable region.
558
559Now that we have the tree, we determine what the "best" formatting is by finding
560the path through the tree with the lowest cost.
561
562And that's it!