xref: /aosp_15_r20/external/yapf/README.rst (revision 7249d1a64f4850ccf838e62a46276f891f72998e)
1*7249d1a6SKrzysztof Kosiński====
2*7249d1a6SKrzysztof KosińskiYAPF
3*7249d1a6SKrzysztof Kosiński====
4*7249d1a6SKrzysztof Kosiński
5*7249d1a6SKrzysztof Kosiński.. image:: https://badge.fury.io/py/yapf.svg
6*7249d1a6SKrzysztof Kosiński    :target: https://badge.fury.io/py/yapf
7*7249d1a6SKrzysztof Kosiński    :alt: PyPI version
8*7249d1a6SKrzysztof Kosiński
9*7249d1a6SKrzysztof Kosiński.. image:: https://github.com/google/yapf/actions/workflows/ci.yml/badge.svg
10*7249d1a6SKrzysztof Kosiński    :target: https://github.com/google/yapf/actions
11*7249d1a6SKrzysztof Kosiński    :alt: Build status
12*7249d1a6SKrzysztof Kosiński
13*7249d1a6SKrzysztof Kosiński.. image:: https://coveralls.io/repos/google/yapf/badge.svg?branch=main
14*7249d1a6SKrzysztof Kosiński    :target: https://coveralls.io/r/google/yapf?branch=main
15*7249d1a6SKrzysztof Kosiński    :alt: Coverage status
16*7249d1a6SKrzysztof Kosiński
17*7249d1a6SKrzysztof Kosiński
18*7249d1a6SKrzysztof KosińskiIntroduction
19*7249d1a6SKrzysztof Kosiński============
20*7249d1a6SKrzysztof Kosiński
21*7249d1a6SKrzysztof KosińskiMost of the current formatters for Python --- e.g., autopep8, and pep8ify ---
22*7249d1a6SKrzysztof Kosińskiare made to remove lint errors from code. This has some obvious limitations.
23*7249d1a6SKrzysztof KosińskiFor instance, code that conforms to the PEP 8 guidelines may not be
24*7249d1a6SKrzysztof Kosińskireformatted.  But it doesn't mean that the code looks good.
25*7249d1a6SKrzysztof Kosiński
26*7249d1a6SKrzysztof KosińskiYAPF takes a different approach. It's based off of `'clang-format' <https://cl
27*7249d1a6SKrzysztof Kosińskiang.llvm.org/docs/ClangFormat.html>`_, developed by Daniel Jasper. In essence,
28*7249d1a6SKrzysztof Kosińskithe algorithm takes the code and reformats it to the best formatting that
29*7249d1a6SKrzysztof Kosińskiconforms to the style guide, even if the original code didn't violate the
30*7249d1a6SKrzysztof Kosińskistyle guide. The idea is also similar to the `'gofmt' <https://golang.org/cmd/
31*7249d1a6SKrzysztof Kosińskigofmt/>`_ tool for the Go programming language: end all holy wars about
32*7249d1a6SKrzysztof Kosińskiformatting - if the whole codebase of a project is simply piped through YAPF
33*7249d1a6SKrzysztof Kosińskiwhenever modifications are made, the style remains consistent throughout the
34*7249d1a6SKrzysztof Kosińskiproject and there's no point arguing about style in every code review.
35*7249d1a6SKrzysztof Kosiński
36*7249d1a6SKrzysztof KosińskiThe ultimate goal is that the code YAPF produces is as good as the code that a
37*7249d1a6SKrzysztof Kosińskiprogrammer would write if they were following the style guide. It takes away
38*7249d1a6SKrzysztof Kosińskisome of the drudgery of maintaining your code.
39*7249d1a6SKrzysztof Kosiński
40*7249d1a6SKrzysztof Kosiński.. footer::
41*7249d1a6SKrzysztof Kosiński
42*7249d1a6SKrzysztof Kosiński    YAPF is not an official Google product (experimental or otherwise), it is
43*7249d1a6SKrzysztof Kosiński    just code that happens to be owned by Google.
44*7249d1a6SKrzysztof Kosiński
45*7249d1a6SKrzysztof Kosiński.. contents::
46*7249d1a6SKrzysztof Kosiński
47*7249d1a6SKrzysztof Kosiński
48*7249d1a6SKrzysztof KosińskiInstallation
49*7249d1a6SKrzysztof Kosiński============
50*7249d1a6SKrzysztof Kosiński
51*7249d1a6SKrzysztof KosińskiTo install YAPF from PyPI:
52*7249d1a6SKrzysztof Kosiński
53*7249d1a6SKrzysztof Kosiński.. code-block:: shell
54*7249d1a6SKrzysztof Kosiński
55*7249d1a6SKrzysztof Kosiński    $ pip install yapf
56*7249d1a6SKrzysztof Kosiński
57*7249d1a6SKrzysztof Kosiński(optional) If you are using Python 2.7 and want to enable multiprocessing:
58*7249d1a6SKrzysztof Kosiński
59*7249d1a6SKrzysztof Kosiński.. code-block:: shell
60*7249d1a6SKrzysztof Kosiński
61*7249d1a6SKrzysztof Kosiński    $ pip install futures
62*7249d1a6SKrzysztof Kosiński
63*7249d1a6SKrzysztof KosińskiYAPF is still considered in "alpha" stage, and the released version may change
64*7249d1a6SKrzysztof Kosińskioften; therefore, the best way to keep up-to-date with the latest development
65*7249d1a6SKrzysztof Kosińskiis to clone this repository.
66*7249d1a6SKrzysztof Kosiński
67*7249d1a6SKrzysztof KosińskiNote that if you intend to use YAPF as a command-line tool rather than as a
68*7249d1a6SKrzysztof Kosińskilibrary, installation is not necessary. YAPF supports being run as a directory
69*7249d1a6SKrzysztof Kosińskiby the Python interpreter. If you cloned/unzipped YAPF into ``DIR``, it's
70*7249d1a6SKrzysztof Kosińskipossible to run:
71*7249d1a6SKrzysztof Kosiński
72*7249d1a6SKrzysztof Kosiński.. code-block:: shell
73*7249d1a6SKrzysztof Kosiński
74*7249d1a6SKrzysztof Kosiński    $ PYTHONPATH=DIR python DIR/yapf [options] ...
75*7249d1a6SKrzysztof Kosiński
76*7249d1a6SKrzysztof Kosiński
77*7249d1a6SKrzysztof KosińskiPython versions
78*7249d1a6SKrzysztof Kosiński===============
79*7249d1a6SKrzysztof Kosiński
80*7249d1a6SKrzysztof KosińskiYAPF supports Python 2.7 and 3.6.4+. (Note that some Python 3 features may fail
81*7249d1a6SKrzysztof Kosińskito parse with Python versions before 3.6.4.)
82*7249d1a6SKrzysztof Kosiński
83*7249d1a6SKrzysztof KosińskiYAPF requires the code it formats to be valid Python for the version YAPF itself
84*7249d1a6SKrzysztof Kosińskiruns under. Therefore, if you format Python 3 code with YAPF, run YAPF itself
85*7249d1a6SKrzysztof Kosińskiunder Python 3 (and similarly for Python 2).
86*7249d1a6SKrzysztof Kosiński
87*7249d1a6SKrzysztof Kosiński
88*7249d1a6SKrzysztof KosińskiUsage
89*7249d1a6SKrzysztof Kosiński=====
90*7249d1a6SKrzysztof Kosiński
91*7249d1a6SKrzysztof KosińskiOptions::
92*7249d1a6SKrzysztof Kosiński
93*7249d1a6SKrzysztof Kosiński    usage: yapf [-h] [-v] [-d | -i] [-r | -l START-END] [-e PATTERN]
94*7249d1a6SKrzysztof Kosiński                [--style STYLE] [--style-help] [--no-local-style] [-p]
95*7249d1a6SKrzysztof Kosiński                [-vv]
96*7249d1a6SKrzysztof Kosiński                [files [files ...]]
97*7249d1a6SKrzysztof Kosiński
98*7249d1a6SKrzysztof Kosiński    Formatter for Python code.
99*7249d1a6SKrzysztof Kosiński
100*7249d1a6SKrzysztof Kosiński    positional arguments:
101*7249d1a6SKrzysztof Kosiński      files
102*7249d1a6SKrzysztof Kosiński
103*7249d1a6SKrzysztof Kosiński    optional arguments:
104*7249d1a6SKrzysztof Kosiński      -h, --help            show this help message and exit
105*7249d1a6SKrzysztof Kosiński      -v, --version         show version number and exit
106*7249d1a6SKrzysztof Kosiński      -d, --diff            print the diff for the fixed source
107*7249d1a6SKrzysztof Kosiński      -i, --in-place        make changes to files in place
108*7249d1a6SKrzysztof Kosiński      -r, --recursive       run recursively over directories
109*7249d1a6SKrzysztof Kosiński      -l START-END, --lines START-END
110*7249d1a6SKrzysztof Kosiński                            range of lines to reformat, one-based
111*7249d1a6SKrzysztof Kosiński      -e PATTERN, --exclude PATTERN
112*7249d1a6SKrzysztof Kosiński                            patterns for files to exclude from formatting
113*7249d1a6SKrzysztof Kosiński      --style STYLE         specify formatting style: either a style name (for
114*7249d1a6SKrzysztof Kosiński                            example "pep8" or "google"), or the name of a file
115*7249d1a6SKrzysztof Kosiński                            with style settings. The default is pep8 unless a
116*7249d1a6SKrzysztof Kosiński                            .style.yapf or setup.cfg or pyproject.toml file
117*7249d1a6SKrzysztof Kosiński                            located in the same directory as the source or one of
118*7249d1a6SKrzysztof Kosiński                            its parent directories (for stdin, the current
119*7249d1a6SKrzysztof Kosiński                            directory is used).
120*7249d1a6SKrzysztof Kosiński      --style-help          show style settings and exit; this output can be saved
121*7249d1a6SKrzysztof Kosiński                            to .style.yapf to make your settings permanent
122*7249d1a6SKrzysztof Kosiński      --no-local-style      don't search for local style definition
123*7249d1a6SKrzysztof Kosiński      -p, --parallel        Run yapf in parallel when formatting multiple files.
124*7249d1a6SKrzysztof Kosiński                            Requires concurrent.futures in Python 2.X
125*7249d1a6SKrzysztof Kosiński      -vv, --verbose        Print out file names while processing
126*7249d1a6SKrzysztof Kosiński
127*7249d1a6SKrzysztof Kosiński
128*7249d1a6SKrzysztof Kosiński------------
129*7249d1a6SKrzysztof KosińskiReturn Codes
130*7249d1a6SKrzysztof Kosiński------------
131*7249d1a6SKrzysztof Kosiński
132*7249d1a6SKrzysztof KosińskiNormally YAPF returns zero on successful program termination and non-zero otherwise.
133*7249d1a6SKrzysztof Kosiński
134*7249d1a6SKrzysztof KosińskiIf ``--diff`` is supplied, YAPF returns zero when no changes were necessary, non-zero
135*7249d1a6SKrzysztof Kosińskiotherwise (including program error). You can use this in a CI workflow to test that code
136*7249d1a6SKrzysztof Kosińskihas been YAPF-formatted.
137*7249d1a6SKrzysztof Kosiński
138*7249d1a6SKrzysztof Kosiński---------------------------------------------
139*7249d1a6SKrzysztof KosińskiExcluding files from formatting (.yapfignore or pyproject.toml)
140*7249d1a6SKrzysztof Kosiński---------------------------------------------
141*7249d1a6SKrzysztof Kosiński
142*7249d1a6SKrzysztof KosińskiIn addition to exclude patterns provided on commandline, YAPF looks for additional
143*7249d1a6SKrzysztof Kosińskipatterns specified in a file named ``.yapfignore`` or ``pyproject.toml`` located in the
144*7249d1a6SKrzysztof Kosińskiworking directory from which YAPF is invoked.
145*7249d1a6SKrzysztof Kosiński
146*7249d1a6SKrzysztof Kosiński``.yapfignore``'s syntax is similar to UNIX's filename pattern matching::
147*7249d1a6SKrzysztof Kosiński
148*7249d1a6SKrzysztof Kosiński    *       matches everything
149*7249d1a6SKrzysztof Kosiński    ?       matches any single character
150*7249d1a6SKrzysztof Kosiński    [seq]   matches any character in seq
151*7249d1a6SKrzysztof Kosiński    [!seq]  matches any character not in seq
152*7249d1a6SKrzysztof Kosiński
153*7249d1a6SKrzysztof KosińskiNote that no entry should begin with `./`.
154*7249d1a6SKrzysztof Kosiński
155*7249d1a6SKrzysztof KosińskiIf you use ``pyproject.toml``, exclude patterns are specified by ``ignore_pattens`` key
156*7249d1a6SKrzysztof Kosińskiin ``[tool.yapfignore]`` section. For example:
157*7249d1a6SKrzysztof Kosiński
158*7249d1a6SKrzysztof Kosiński.. code-block:: ini
159*7249d1a6SKrzysztof Kosiński
160*7249d1a6SKrzysztof Kosiński   [tool.yapfignore]
161*7249d1a6SKrzysztof Kosiński   ignore_patterns = [
162*7249d1a6SKrzysztof Kosiński     "temp/**/*.py",
163*7249d1a6SKrzysztof Kosiński     "temp2/*.py"
164*7249d1a6SKrzysztof Kosiński   ]
165*7249d1a6SKrzysztof Kosiński
166*7249d1a6SKrzysztof KosińskiFormatting style
167*7249d1a6SKrzysztof Kosiński================
168*7249d1a6SKrzysztof Kosiński
169*7249d1a6SKrzysztof KosińskiThe formatting style used by YAPF is configurable and there are many "knobs"
170*7249d1a6SKrzysztof Kosińskithat can be used to tune how YAPF does formatting. See the ``style.py`` module
171*7249d1a6SKrzysztof Kosińskifor the full list.
172*7249d1a6SKrzysztof Kosiński
173*7249d1a6SKrzysztof KosińskiTo control the style, run YAPF with the ``--style`` argument. It accepts one of
174*7249d1a6SKrzysztof Kosińskithe predefined styles (e.g., ``pep8`` or ``google``), a path to a configuration
175*7249d1a6SKrzysztof Kosińskifile that specifies the desired style, or a dictionary of key/value pairs.
176*7249d1a6SKrzysztof Kosiński
177*7249d1a6SKrzysztof KosińskiThe config file is a simple listing of (case-insensitive) ``key = value`` pairs
178*7249d1a6SKrzysztof Kosińskiwith a ``[style]`` heading. For example:
179*7249d1a6SKrzysztof Kosiński
180*7249d1a6SKrzysztof Kosiński.. code-block:: ini
181*7249d1a6SKrzysztof Kosiński
182*7249d1a6SKrzysztof Kosiński    [style]
183*7249d1a6SKrzysztof Kosiński    based_on_style = pep8
184*7249d1a6SKrzysztof Kosiński    spaces_before_comment = 4
185*7249d1a6SKrzysztof Kosiński    split_before_logical_operator = true
186*7249d1a6SKrzysztof Kosiński
187*7249d1a6SKrzysztof KosińskiThe ``based_on_style`` setting determines which of the predefined styles this
188*7249d1a6SKrzysztof Kosińskicustom style is based on (think of it like subclassing). Four
189*7249d1a6SKrzysztof Kosińskistyles are predefined:
190*7249d1a6SKrzysztof Kosiński
191*7249d1a6SKrzysztof Kosiński- ``pep8`` (default)
192*7249d1a6SKrzysztof Kosiński- ``google`` (based off of the `Google Python Style Guide`_)
193*7249d1a6SKrzysztof Kosiński- ``yapf`` (for use with Google open source projects)
194*7249d1a6SKrzysztof Kosiński- ``facebook``
195*7249d1a6SKrzysztof Kosiński
196*7249d1a6SKrzysztof Kosiński.. _`Google Python Style Guide`: https://github.com/google/styleguide/blob/gh-pages/pyguide.md
197*7249d1a6SKrzysztof Kosiński
198*7249d1a6SKrzysztof KosińskiSee ``_STYLE_NAME_TO_FACTORY`` in style.py_ for details.
199*7249d1a6SKrzysztof Kosiński
200*7249d1a6SKrzysztof Kosiński.. _style.py: https://github.com/google/yapf/blob/main/yapf/yapflib/style.py
201*7249d1a6SKrzysztof Kosiński
202*7249d1a6SKrzysztof KosińskiIt's also possible to do the same on the command line with a dictionary. For
203*7249d1a6SKrzysztof Kosińskiexample:
204*7249d1a6SKrzysztof Kosiński
205*7249d1a6SKrzysztof Kosiński.. code-block:: shell
206*7249d1a6SKrzysztof Kosiński
207*7249d1a6SKrzysztof Kosiński    --style='{based_on_style: pep8, indent_width: 2}'
208*7249d1a6SKrzysztof Kosiński
209*7249d1a6SKrzysztof KosińskiThis will take the ``pep8`` base style and modify it to have two space
210*7249d1a6SKrzysztof Kosińskiindentations.
211*7249d1a6SKrzysztof Kosiński
212*7249d1a6SKrzysztof KosińskiYAPF will search for the formatting style in the following manner:
213*7249d1a6SKrzysztof Kosiński
214*7249d1a6SKrzysztof Kosiński1. Specified on the command line
215*7249d1a6SKrzysztof Kosiński2. In the ``[style]`` section of a ``.style.yapf`` file in either the current
216*7249d1a6SKrzysztof Kosiński   directory or one of its parent directories.
217*7249d1a6SKrzysztof Kosiński3. In the ``[yapf]`` section of a ``setup.cfg`` file in either the current
218*7249d1a6SKrzysztof Kosiński   directory or one of its parent directories.
219*7249d1a6SKrzysztof Kosiński4. In the ``[tool.yapf]`` section of a ``pyproject.toml`` file in either the current
220*7249d1a6SKrzysztof Kosiński   directory or one of its parent directories.
221*7249d1a6SKrzysztof Kosiński5. In the ``[style]`` section of a ``~/.config/yapf/style`` file in your home
222*7249d1a6SKrzysztof Kosiński   directory.
223*7249d1a6SKrzysztof Kosiński
224*7249d1a6SKrzysztof KosińskiIf none of those files are found, the default style is used (PEP8).
225*7249d1a6SKrzysztof Kosiński
226*7249d1a6SKrzysztof Kosiński
227*7249d1a6SKrzysztof KosińskiExample
228*7249d1a6SKrzysztof Kosiński=======
229*7249d1a6SKrzysztof Kosiński
230*7249d1a6SKrzysztof KosińskiAn example of the type of formatting that YAPF can do, it will take this ugly
231*7249d1a6SKrzysztof Kosińskicode:
232*7249d1a6SKrzysztof Kosiński
233*7249d1a6SKrzysztof Kosiński.. code-block:: python
234*7249d1a6SKrzysztof Kosiński
235*7249d1a6SKrzysztof Kosiński    x = {  'a':37,'b':42,
236*7249d1a6SKrzysztof Kosiński
237*7249d1a6SKrzysztof Kosiński    'c':927}
238*7249d1a6SKrzysztof Kosiński
239*7249d1a6SKrzysztof Kosiński    y = 'hello ''world'
240*7249d1a6SKrzysztof Kosiński    z = 'hello '+'world'
241*7249d1a6SKrzysztof Kosiński    a = 'hello {}'.format('world')
242*7249d1a6SKrzysztof Kosiński    class foo  (     object  ):
243*7249d1a6SKrzysztof Kosiński      def f    (self   ):
244*7249d1a6SKrzysztof Kosiński        return       37*-+2
245*7249d1a6SKrzysztof Kosiński      def g(self, x,y=42):
246*7249d1a6SKrzysztof Kosiński          return y
247*7249d1a6SKrzysztof Kosiński    def f  (   a ) :
248*7249d1a6SKrzysztof Kosiński      return      37+-+a[42-x :  y**3]
249*7249d1a6SKrzysztof Kosiński
250*7249d1a6SKrzysztof Kosińskiand reformat it into:
251*7249d1a6SKrzysztof Kosiński
252*7249d1a6SKrzysztof Kosiński.. code-block:: python
253*7249d1a6SKrzysztof Kosiński
254*7249d1a6SKrzysztof Kosiński    x = {'a': 37, 'b': 42, 'c': 927}
255*7249d1a6SKrzysztof Kosiński
256*7249d1a6SKrzysztof Kosiński    y = 'hello ' 'world'
257*7249d1a6SKrzysztof Kosiński    z = 'hello ' + 'world'
258*7249d1a6SKrzysztof Kosiński    a = 'hello {}'.format('world')
259*7249d1a6SKrzysztof Kosiński
260*7249d1a6SKrzysztof Kosiński
261*7249d1a6SKrzysztof Kosiński    class foo(object):
262*7249d1a6SKrzysztof Kosiński        def f(self):
263*7249d1a6SKrzysztof Kosiński            return 37 * -+2
264*7249d1a6SKrzysztof Kosiński
265*7249d1a6SKrzysztof Kosiński        def g(self, x, y=42):
266*7249d1a6SKrzysztof Kosiński            return y
267*7249d1a6SKrzysztof Kosiński
268*7249d1a6SKrzysztof Kosiński
269*7249d1a6SKrzysztof Kosiński    def f(a):
270*7249d1a6SKrzysztof Kosiński        return 37 + -+a[42 - x:y**3]
271*7249d1a6SKrzysztof Kosiński
272*7249d1a6SKrzysztof Kosiński
273*7249d1a6SKrzysztof KosińskiExample as a module
274*7249d1a6SKrzysztof Kosiński===================
275*7249d1a6SKrzysztof Kosiński
276*7249d1a6SKrzysztof KosińskiThe two main APIs for calling yapf are ``FormatCode`` and ``FormatFile``, these
277*7249d1a6SKrzysztof Kosińskishare several arguments which are described below:
278*7249d1a6SKrzysztof Kosiński
279*7249d1a6SKrzysztof Kosiński.. code-block:: python
280*7249d1a6SKrzysztof Kosiński
281*7249d1a6SKrzysztof Kosiński    >>> from yapf.yapflib.yapf_api import FormatCode  # reformat a string of code
282*7249d1a6SKrzysztof Kosiński
283*7249d1a6SKrzysztof Kosiński    >>> formatted_code, changed = FormatCode("f ( a = 1, b = 2 )")
284*7249d1a6SKrzysztof Kosiński    >>> formatted_code
285*7249d1a6SKrzysztof Kosiński    'f(a=1, b=2)\n'
286*7249d1a6SKrzysztof Kosiński    >>> changed
287*7249d1a6SKrzysztof Kosiński    True
288*7249d1a6SKrzysztof Kosiński
289*7249d1a6SKrzysztof KosińskiA ``style_config`` argument: Either a style name or a path to a file that contains
290*7249d1a6SKrzysztof Kosińskiformatting style settings. If None is specified, use the default style
291*7249d1a6SKrzysztof Kosińskias set in ``style.DEFAULT_STYLE_FACTORY``.
292*7249d1a6SKrzysztof Kosiński
293*7249d1a6SKrzysztof Kosiński.. code-block:: python
294*7249d1a6SKrzysztof Kosiński
295*7249d1a6SKrzysztof Kosiński    >>> FormatCode("def g():\n  return True", style_config='pep8')[0]
296*7249d1a6SKrzysztof Kosiński    'def g():\n    return True\n'
297*7249d1a6SKrzysztof Kosiński
298*7249d1a6SKrzysztof KosińskiA ``lines`` argument: A list of tuples of lines (ints), [start, end],
299*7249d1a6SKrzysztof Kosińskithat we want to format. The lines are 1-based indexed. It can be used by
300*7249d1a6SKrzysztof Kosińskithird-party code (e.g., IDEs) when reformatting a snippet of code rather
301*7249d1a6SKrzysztof Kosińskithan a whole file.
302*7249d1a6SKrzysztof Kosiński
303*7249d1a6SKrzysztof Kosiński.. code-block:: python
304*7249d1a6SKrzysztof Kosiński
305*7249d1a6SKrzysztof Kosiński    >>> FormatCode("def g( ):\n    a=1\n    b = 2\n    return a==b", lines=[(1, 1), (2, 3)])[0]
306*7249d1a6SKrzysztof Kosiński    'def g():\n    a = 1\n    b = 2\n    return a==b\n'
307*7249d1a6SKrzysztof Kosiński
308*7249d1a6SKrzysztof KosińskiA ``print_diff`` (bool): Instead of returning the reformatted source, return a
309*7249d1a6SKrzysztof Kosińskidiff that turns the formatted source into reformatted source.
310*7249d1a6SKrzysztof Kosiński
311*7249d1a6SKrzysztof Kosiński.. code-block:: python
312*7249d1a6SKrzysztof Kosiński
313*7249d1a6SKrzysztof Kosiński    >>> print(FormatCode("a==b", filename="foo.py", print_diff=True)[0])
314*7249d1a6SKrzysztof Kosiński    --- foo.py (original)
315*7249d1a6SKrzysztof Kosiński    +++ foo.py (reformatted)
316*7249d1a6SKrzysztof Kosiński    @@ -1 +1 @@
317*7249d1a6SKrzysztof Kosiński    -a==b
318*7249d1a6SKrzysztof Kosiński    +a == b
319*7249d1a6SKrzysztof Kosiński
320*7249d1a6SKrzysztof KosińskiNote: the ``filename`` argument for ``FormatCode`` is what is inserted into
321*7249d1a6SKrzysztof Kosińskithe diff, the default is ``<unknown>``.
322*7249d1a6SKrzysztof Kosiński
323*7249d1a6SKrzysztof Kosiński``FormatFile`` returns reformatted code from the passed file along with its encoding:
324*7249d1a6SKrzysztof Kosiński
325*7249d1a6SKrzysztof Kosiński.. code-block:: python
326*7249d1a6SKrzysztof Kosiński
327*7249d1a6SKrzysztof Kosiński    >>> from yapf.yapflib.yapf_api import FormatFile  # reformat a file
328*7249d1a6SKrzysztof Kosiński
329*7249d1a6SKrzysztof Kosiński    >>> print(open("foo.py").read())  # contents of file
330*7249d1a6SKrzysztof Kosiński    a==b
331*7249d1a6SKrzysztof Kosiński
332*7249d1a6SKrzysztof Kosiński    >>> reformatted_code, encoding, changed = FormatFile("foo.py")
333*7249d1a6SKrzysztof Kosiński    >>> formatted_code
334*7249d1a6SKrzysztof Kosiński    'a == b\n'
335*7249d1a6SKrzysztof Kosiński    >>> encoding
336*7249d1a6SKrzysztof Kosiński    'utf-8'
337*7249d1a6SKrzysztof Kosiński    >>> changed
338*7249d1a6SKrzysztof Kosiński    True
339*7249d1a6SKrzysztof Kosiński
340*7249d1a6SKrzysztof KosińskiThe ``in_place`` argument saves the reformatted code back to the file:
341*7249d1a6SKrzysztof Kosiński
342*7249d1a6SKrzysztof Kosiński.. code-block:: python
343*7249d1a6SKrzysztof Kosiński
344*7249d1a6SKrzysztof Kosiński    >>> FormatFile("foo.py", in_place=True)[:2]
345*7249d1a6SKrzysztof Kosiński    (None, 'utf-8')
346*7249d1a6SKrzysztof Kosiński
347*7249d1a6SKrzysztof Kosiński    >>> print(open("foo.py").read())  # contents of file (now fixed)
348*7249d1a6SKrzysztof Kosiński    a == b
349*7249d1a6SKrzysztof Kosiński
350*7249d1a6SKrzysztof KosińskiFormatting diffs
351*7249d1a6SKrzysztof Kosiński================
352*7249d1a6SKrzysztof Kosiński
353*7249d1a6SKrzysztof KosińskiOptions::
354*7249d1a6SKrzysztof Kosiński
355*7249d1a6SKrzysztof Kosiński    usage: yapf-diff [-h] [-i] [-p NUM] [--regex PATTERN] [--iregex PATTERN][-v]
356*7249d1a6SKrzysztof Kosiński                     [--style STYLE] [--binary BINARY]
357*7249d1a6SKrzysztof Kosiński
358*7249d1a6SKrzysztof Kosiński    This script reads input from a unified diff and reformats all the changed
359*7249d1a6SKrzysztof Kosiński    lines. This is useful to reformat all the lines touched by a specific patch.
360*7249d1a6SKrzysztof Kosiński    Example usage for git/svn users:
361*7249d1a6SKrzysztof Kosiński
362*7249d1a6SKrzysztof Kosiński      git diff -U0 --no-color --relative HEAD^ | yapf-diff -i
363*7249d1a6SKrzysztof Kosiński      svn diff --diff-cmd=diff -x-U0 | yapf-diff -p0 -i
364*7249d1a6SKrzysztof Kosiński
365*7249d1a6SKrzysztof Kosiński    It should be noted that the filename contained in the diff is used
366*7249d1a6SKrzysztof Kosiński    unmodified to determine the source file to update. Users calling this script
367*7249d1a6SKrzysztof Kosiński    directly should be careful to ensure that the path in the diff is correct
368*7249d1a6SKrzysztof Kosiński    relative to the current working directory.
369*7249d1a6SKrzysztof Kosiński
370*7249d1a6SKrzysztof Kosiński    optional arguments:
371*7249d1a6SKrzysztof Kosiński      -h, --help            show this help message and exit
372*7249d1a6SKrzysztof Kosiński      -i, --in-place        apply edits to files instead of displaying a diff
373*7249d1a6SKrzysztof Kosiński      -p NUM, --prefix NUM  strip the smallest prefix containing P slashes
374*7249d1a6SKrzysztof Kosiński      --regex PATTERN       custom pattern selecting file paths to reformat
375*7249d1a6SKrzysztof Kosiński                            (case sensitive, overrides -iregex)
376*7249d1a6SKrzysztof Kosiński      --iregex PATTERN      custom pattern selecting file paths to reformat
377*7249d1a6SKrzysztof Kosiński                            (case insensitive, overridden by -regex)
378*7249d1a6SKrzysztof Kosiński      -v, --verbose         be more verbose, ineffective without -i
379*7249d1a6SKrzysztof Kosiński      --style STYLE         specify formatting style: either a style name (for
380*7249d1a6SKrzysztof Kosiński                            example "pep8" or "google"), or the name of a file
381*7249d1a6SKrzysztof Kosiński                            with style settings. The default is pep8 unless a
382*7249d1a6SKrzysztof Kosiński                            .style.yapf or setup.cfg or pyproject.toml file
383*7249d1a6SKrzysztof Kosiński                            located in the same directory as the source or one of
384*7249d1a6SKrzysztof Kosiński                            its parent directories (for stdin, the current
385*7249d1a6SKrzysztof Kosiński                            directory is used).
386*7249d1a6SKrzysztof Kosiński      --binary BINARY       location of binary to use for yapf
387*7249d1a6SKrzysztof Kosiński
388*7249d1a6SKrzysztof KosińskiKnobs
389*7249d1a6SKrzysztof Kosiński=====
390*7249d1a6SKrzysztof Kosiński
391*7249d1a6SKrzysztof Kosiński``ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT``
392*7249d1a6SKrzysztof Kosiński    Align closing bracket with visual indentation.
393*7249d1a6SKrzysztof Kosiński
394*7249d1a6SKrzysztof Kosiński``ALLOW_MULTILINE_LAMBDAS``
395*7249d1a6SKrzysztof Kosiński    Allow lambdas to be formatted on more than one line.
396*7249d1a6SKrzysztof Kosiński
397*7249d1a6SKrzysztof Kosiński``ALLOW_MULTILINE_DICTIONARY_KEYS``
398*7249d1a6SKrzysztof Kosiński    Allow dictionary keys to exist on multiple lines. For example:
399*7249d1a6SKrzysztof Kosiński
400*7249d1a6SKrzysztof Kosiński    .. code-block:: python
401*7249d1a6SKrzysztof Kosiński
402*7249d1a6SKrzysztof Kosiński        x = {
403*7249d1a6SKrzysztof Kosiński            ('this is the first element of a tuple',
404*7249d1a6SKrzysztof Kosiński             'this is the second element of a tuple'):
405*7249d1a6SKrzysztof Kosiński                 value,
406*7249d1a6SKrzysztof Kosiński        }
407*7249d1a6SKrzysztof Kosiński
408*7249d1a6SKrzysztof Kosiński``ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS``
409*7249d1a6SKrzysztof Kosiński    Allow splitting before a default / named assignment in an argument list.
410*7249d1a6SKrzysztof Kosiński
411*7249d1a6SKrzysztof Kosiński``ALLOW_SPLIT_BEFORE_DICT_VALUE``
412*7249d1a6SKrzysztof Kosiński    Allow splits before the dictionary value.
413*7249d1a6SKrzysztof Kosiński
414*7249d1a6SKrzysztof Kosiński``ARITHMETIC_PRECEDENCE_INDICATION``
415*7249d1a6SKrzysztof Kosiński    Let spacing indicate operator precedence. For example:
416*7249d1a6SKrzysztof Kosiński
417*7249d1a6SKrzysztof Kosiński    .. code-block:: python
418*7249d1a6SKrzysztof Kosiński
419*7249d1a6SKrzysztof Kosiński        a = 1 * 2 + 3 / 4
420*7249d1a6SKrzysztof Kosiński        b = 1 / 2 - 3 * 4
421*7249d1a6SKrzysztof Kosiński        c = (1 + 2) * (3 - 4)
422*7249d1a6SKrzysztof Kosiński        d = (1 - 2) / (3 + 4)
423*7249d1a6SKrzysztof Kosiński        e = 1 * 2 - 3
424*7249d1a6SKrzysztof Kosiński        f = 1 + 2 + 3 + 4
425*7249d1a6SKrzysztof Kosiński
426*7249d1a6SKrzysztof Kosiński    will be formatted as follows to indicate precedence:
427*7249d1a6SKrzysztof Kosiński
428*7249d1a6SKrzysztof Kosiński    .. code-block:: python
429*7249d1a6SKrzysztof Kosiński
430*7249d1a6SKrzysztof Kosiński        a = 1*2 + 3/4
431*7249d1a6SKrzysztof Kosiński        b = 1/2 - 3*4
432*7249d1a6SKrzysztof Kosiński        c = (1+2) * (3-4)
433*7249d1a6SKrzysztof Kosiński        d = (1-2) / (3+4)
434*7249d1a6SKrzysztof Kosiński        e = 1*2 - 3
435*7249d1a6SKrzysztof Kosiński        f = 1 + 2 + 3 + 4
436*7249d1a6SKrzysztof Kosiński
437*7249d1a6SKrzysztof Kosiński``BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF``
438*7249d1a6SKrzysztof Kosiński    Insert a blank line before a ``def`` or ``class`` immediately nested within
439*7249d1a6SKrzysztof Kosiński    another ``def`` or ``class``. For example:
440*7249d1a6SKrzysztof Kosiński
441*7249d1a6SKrzysztof Kosiński    .. code-block:: python
442*7249d1a6SKrzysztof Kosiński
443*7249d1a6SKrzysztof Kosiński        class Foo:
444*7249d1a6SKrzysztof Kosiński                           # <------ this blank line
445*7249d1a6SKrzysztof Kosiński            def method():
446*7249d1a6SKrzysztof Kosiński                pass
447*7249d1a6SKrzysztof Kosiński
448*7249d1a6SKrzysztof Kosiński``BLANK_LINE_BEFORE_MODULE_DOCSTRING``
449*7249d1a6SKrzysztof Kosiński    Insert a blank line before a module docstring.
450*7249d1a6SKrzysztof Kosiński
451*7249d1a6SKrzysztof Kosiński``BLANK_LINE_BEFORE_CLASS_DOCSTRING``
452*7249d1a6SKrzysztof Kosiński    Insert a blank line before a class-level docstring.
453*7249d1a6SKrzysztof Kosiński
454*7249d1a6SKrzysztof Kosiński``BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION``
455*7249d1a6SKrzysztof Kosiński    Sets the number of desired blank lines surrounding top-level function and
456*7249d1a6SKrzysztof Kosiński    class definitions. For example:
457*7249d1a6SKrzysztof Kosiński
458*7249d1a6SKrzysztof Kosiński    .. code-block:: python
459*7249d1a6SKrzysztof Kosiński
460*7249d1a6SKrzysztof Kosiński        class Foo:
461*7249d1a6SKrzysztof Kosiński            pass
462*7249d1a6SKrzysztof Kosiński                           # <------ having two blank lines here
463*7249d1a6SKrzysztof Kosiński                           # <------ is the default setting
464*7249d1a6SKrzysztof Kosiński        class Bar:
465*7249d1a6SKrzysztof Kosiński            pass
466*7249d1a6SKrzysztof Kosiński
467*7249d1a6SKrzysztof Kosiński``BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES``
468*7249d1a6SKrzysztof Kosiński    Sets the number of desired blank lines between top-level imports and
469*7249d1a6SKrzysztof Kosiński    variable definitions. Useful for compatibility with tools like isort.
470*7249d1a6SKrzysztof Kosiński
471*7249d1a6SKrzysztof Kosiński``COALESCE_BRACKETS``
472*7249d1a6SKrzysztof Kosiński    Do not split consecutive brackets. Only relevant when
473*7249d1a6SKrzysztof Kosiński    ``DEDENT_CLOSING_BRACKETS`` or ``INDENT_CLOSING_BRACKETS``
474*7249d1a6SKrzysztof Kosiński    is set. For example:
475*7249d1a6SKrzysztof Kosiński
476*7249d1a6SKrzysztof Kosiński    .. code-block:: python
477*7249d1a6SKrzysztof Kosiński
478*7249d1a6SKrzysztof Kosiński        call_func_that_takes_a_dict(
479*7249d1a6SKrzysztof Kosiński            {
480*7249d1a6SKrzysztof Kosiński                'key1': 'value1',
481*7249d1a6SKrzysztof Kosiński                'key2': 'value2',
482*7249d1a6SKrzysztof Kosiński            }
483*7249d1a6SKrzysztof Kosiński        )
484*7249d1a6SKrzysztof Kosiński
485*7249d1a6SKrzysztof Kosiński    would reformat to:
486*7249d1a6SKrzysztof Kosiński
487*7249d1a6SKrzysztof Kosiński    .. code-block:: python
488*7249d1a6SKrzysztof Kosiński
489*7249d1a6SKrzysztof Kosiński        call_func_that_takes_a_dict({
490*7249d1a6SKrzysztof Kosiński            'key1': 'value1',
491*7249d1a6SKrzysztof Kosiński            'key2': 'value2',
492*7249d1a6SKrzysztof Kosiński        })
493*7249d1a6SKrzysztof Kosiński
494*7249d1a6SKrzysztof Kosiński
495*7249d1a6SKrzysztof Kosiński``COLUMN_LIMIT``
496*7249d1a6SKrzysztof Kosiński    The column limit (or max line-length)
497*7249d1a6SKrzysztof Kosiński
498*7249d1a6SKrzysztof Kosiński``CONTINUATION_ALIGN_STYLE``
499*7249d1a6SKrzysztof Kosiński    The style for continuation alignment. Possible values are:
500*7249d1a6SKrzysztof Kosiński
501*7249d1a6SKrzysztof Kosiński    - ``SPACE``: Use spaces for continuation alignment. This is default
502*7249d1a6SKrzysztof Kosiński      behavior.
503*7249d1a6SKrzysztof Kosiński    - ``FIXED``: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns
504*7249d1a6SKrzysztof Kosiński      (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs or CONTINUATION_INDENT_WIDTH
505*7249d1a6SKrzysztof Kosiński      spaces) for continuation alignment.
506*7249d1a6SKrzysztof Kosiński    - ``VALIGN-RIGHT``: Vertically align continuation lines to multiple of
507*7249d1a6SKrzysztof Kosiński      INDENT_WIDTH columns. Slightly right (one tab or a few spaces) if cannot
508*7249d1a6SKrzysztof Kosiński      vertically align continuation lines with indent characters.
509*7249d1a6SKrzysztof Kosiński
510*7249d1a6SKrzysztof Kosiński``CONTINUATION_INDENT_WIDTH``
511*7249d1a6SKrzysztof Kosiński    Indent width used for line continuations.
512*7249d1a6SKrzysztof Kosiński
513*7249d1a6SKrzysztof Kosiński``DEDENT_CLOSING_BRACKETS``
514*7249d1a6SKrzysztof Kosiński    Put closing brackets on a separate line, dedented, if the bracketed
515*7249d1a6SKrzysztof Kosiński    expression can't fit in a single line. Applies to all kinds of brackets,
516*7249d1a6SKrzysztof Kosiński    including function definitions and calls. For example:
517*7249d1a6SKrzysztof Kosiński
518*7249d1a6SKrzysztof Kosiński    .. code-block:: python
519*7249d1a6SKrzysztof Kosiński
520*7249d1a6SKrzysztof Kosiński        config = {
521*7249d1a6SKrzysztof Kosiński            'key1': 'value1',
522*7249d1a6SKrzysztof Kosiński            'key2': 'value2',
523*7249d1a6SKrzysztof Kosiński        }  # <--- this bracket is dedented and on a separate line
524*7249d1a6SKrzysztof Kosiński
525*7249d1a6SKrzysztof Kosiński        time_series = self.remote_client.query_entity_counters(
526*7249d1a6SKrzysztof Kosiński            entity='dev3246.region1',
527*7249d1a6SKrzysztof Kosiński            key='dns.query_latency_tcp',
528*7249d1a6SKrzysztof Kosiński            transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
529*7249d1a6SKrzysztof Kosiński            start_ts=now()-timedelta(days=3),
530*7249d1a6SKrzysztof Kosiński            end_ts=now(),
531*7249d1a6SKrzysztof Kosiński        )  # <--- this bracket is dedented and on a separate line
532*7249d1a6SKrzysztof Kosiński
533*7249d1a6SKrzysztof Kosiński``DISABLE_ENDING_COMMA_HEURISTIC``
534*7249d1a6SKrzysztof Kosiński    Disable the heuristic which places each list element on a separate line if
535*7249d1a6SKrzysztof Kosiński    the list is comma-terminated.
536*7249d1a6SKrzysztof Kosiński
537*7249d1a6SKrzysztof Kosiński``EACH_DICT_ENTRY_ON_SEPARATE_LINE``
538*7249d1a6SKrzysztof Kosiński    Place each dictionary entry onto its own line.
539*7249d1a6SKrzysztof Kosiński
540*7249d1a6SKrzysztof Kosiński``FORCE_MULTILINE_DICT``
541*7249d1a6SKrzysztof Kosiński    Respect EACH_DICT_ENTRY_ON_SEPARATE_LINE even if the line is shorter than
542*7249d1a6SKrzysztof Kosiński    COLUMN_LIMIT.
543*7249d1a6SKrzysztof Kosiński
544*7249d1a6SKrzysztof Kosiński``I18N_COMMENT``
545*7249d1a6SKrzysztof Kosiński    The regex for an internationalization comment. The presence of this comment
546*7249d1a6SKrzysztof Kosiński    stops reformatting of that line, because the comments are required to be
547*7249d1a6SKrzysztof Kosiński    next to the string they translate.
548*7249d1a6SKrzysztof Kosiński
549*7249d1a6SKrzysztof Kosiński``I18N_FUNCTION_CALL``
550*7249d1a6SKrzysztof Kosiński    The internationalization function call names. The presence of this function
551*7249d1a6SKrzysztof Kosiński    stops reformatting on that line, because the string it has cannot be moved
552*7249d1a6SKrzysztof Kosiński    away from the i18n comment.
553*7249d1a6SKrzysztof Kosiński
554*7249d1a6SKrzysztof Kosiński``INDENT_DICTIONARY_VALUE``
555*7249d1a6SKrzysztof Kosiński    Indent the dictionary value if it cannot fit on the same line as the
556*7249d1a6SKrzysztof Kosiński    dictionary key. For example:
557*7249d1a6SKrzysztof Kosiński
558*7249d1a6SKrzysztof Kosiński    .. code-block:: python
559*7249d1a6SKrzysztof Kosiński
560*7249d1a6SKrzysztof Kosiński        config = {
561*7249d1a6SKrzysztof Kosiński            'key1':
562*7249d1a6SKrzysztof Kosiński                'value1',
563*7249d1a6SKrzysztof Kosiński            'key2': value1 +
564*7249d1a6SKrzysztof Kosiński                    value2,
565*7249d1a6SKrzysztof Kosiński        }
566*7249d1a6SKrzysztof Kosiński
567*7249d1a6SKrzysztof Kosiński``INDENT_WIDTH``
568*7249d1a6SKrzysztof Kosiński    The number of columns to use for indentation.
569*7249d1a6SKrzysztof Kosiński
570*7249d1a6SKrzysztof Kosiński``INDENT_BLANK_LINES``
571*7249d1a6SKrzysztof Kosiński    Set to ``True`` to prefer indented blank lines rather than empty
572*7249d1a6SKrzysztof Kosiński
573*7249d1a6SKrzysztof Kosiński``INDENT_CLOSING_BRACKETS``
574*7249d1a6SKrzysztof Kosiński    Put closing brackets on a separate line, indented, if the bracketed
575*7249d1a6SKrzysztof Kosiński    expression can't fit in a single line. Applies to all kinds of brackets,
576*7249d1a6SKrzysztof Kosiński    including function definitions and calls. For example:
577*7249d1a6SKrzysztof Kosiński
578*7249d1a6SKrzysztof Kosiński    .. code-block:: python
579*7249d1a6SKrzysztof Kosiński
580*7249d1a6SKrzysztof Kosiński        config = {
581*7249d1a6SKrzysztof Kosiński            'key1': 'value1',
582*7249d1a6SKrzysztof Kosiński            'key2': 'value2',
583*7249d1a6SKrzysztof Kosiński            }  # <--- this bracket is indented and on a separate line
584*7249d1a6SKrzysztof Kosiński
585*7249d1a6SKrzysztof Kosiński        time_series = self.remote_client.query_entity_counters(
586*7249d1a6SKrzysztof Kosiński            entity='dev3246.region1',
587*7249d1a6SKrzysztof Kosiński            key='dns.query_latency_tcp',
588*7249d1a6SKrzysztof Kosiński            transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
589*7249d1a6SKrzysztof Kosiński            start_ts=now()-timedelta(days=3),
590*7249d1a6SKrzysztof Kosiński            end_ts=now(),
591*7249d1a6SKrzysztof Kosiński            )  # <--- this bracket is indented and on a separate line
592*7249d1a6SKrzysztof Kosiński
593*7249d1a6SKrzysztof Kosiński``JOIN_MULTIPLE_LINES``
594*7249d1a6SKrzysztof Kosiński    Join short lines into one line. E.g., single line ``if`` statements.
595*7249d1a6SKrzysztof Kosiński
596*7249d1a6SKrzysztof Kosiński``NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS``
597*7249d1a6SKrzysztof Kosiński    Do not include spaces around selected binary operators. For example:
598*7249d1a6SKrzysztof Kosiński
599*7249d1a6SKrzysztof Kosiński    .. code-block:: python
600*7249d1a6SKrzysztof Kosiński
601*7249d1a6SKrzysztof Kosiński        1 + 2 * 3 - 4 / 5
602*7249d1a6SKrzysztof Kosiński
603*7249d1a6SKrzysztof Kosiński    will be formatted as follows when configured with ``*``, ``/``:
604*7249d1a6SKrzysztof Kosiński
605*7249d1a6SKrzysztof Kosiński    .. code-block:: python
606*7249d1a6SKrzysztof Kosiński
607*7249d1a6SKrzysztof Kosiński        1 + 2*3 - 4/5
608*7249d1a6SKrzysztof Kosiński
609*7249d1a6SKrzysztof Kosiński``SPACES_AROUND_POWER_OPERATOR``
610*7249d1a6SKrzysztof Kosiński    Set to ``True`` to prefer using spaces around ``**``.
611*7249d1a6SKrzysztof Kosiński
612*7249d1a6SKrzysztof Kosiński``SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN``
613*7249d1a6SKrzysztof Kosiński    Set to ``True`` to prefer spaces around the assignment operator for default
614*7249d1a6SKrzysztof Kosiński    or keyword arguments.
615*7249d1a6SKrzysztof Kosiński
616*7249d1a6SKrzysztof Kosiński``SPACES_AROUND_DICT_DELIMITERS``
617*7249d1a6SKrzysztof Kosiński    Adds a space after the opening '{' and before the ending '}' dict delimiters.
618*7249d1a6SKrzysztof Kosiński
619*7249d1a6SKrzysztof Kosiński    .. code-block:: python
620*7249d1a6SKrzysztof Kosiński
621*7249d1a6SKrzysztof Kosiński        {1: 2}
622*7249d1a6SKrzysztof Kosiński
623*7249d1a6SKrzysztof Kosiński    will be formatted as:
624*7249d1a6SKrzysztof Kosiński
625*7249d1a6SKrzysztof Kosiński    .. code-block:: python
626*7249d1a6SKrzysztof Kosiński
627*7249d1a6SKrzysztof Kosiński        { 1: 2 }
628*7249d1a6SKrzysztof Kosiński
629*7249d1a6SKrzysztof Kosiński``SPACES_AROUND_LIST_DELIMITERS``
630*7249d1a6SKrzysztof Kosiński    Adds a space after the opening '[' and before the ending ']' list delimiters.
631*7249d1a6SKrzysztof Kosiński
632*7249d1a6SKrzysztof Kosiński    .. code-block:: python
633*7249d1a6SKrzysztof Kosiński
634*7249d1a6SKrzysztof Kosiński        [1, 2]
635*7249d1a6SKrzysztof Kosiński
636*7249d1a6SKrzysztof Kosiński    will be formatted as:
637*7249d1a6SKrzysztof Kosiński
638*7249d1a6SKrzysztof Kosiński    .. code-block:: python
639*7249d1a6SKrzysztof Kosiński
640*7249d1a6SKrzysztof Kosiński        [ 1, 2 ]
641*7249d1a6SKrzysztof Kosiński
642*7249d1a6SKrzysztof Kosiński``SPACES_AROUND_SUBSCRIPT_COLON``
643*7249d1a6SKrzysztof Kosiński    Use spaces around the subscript / slice operator.  For example:
644*7249d1a6SKrzysztof Kosiński
645*7249d1a6SKrzysztof Kosiński    .. code-block:: python
646*7249d1a6SKrzysztof Kosiński
647*7249d1a6SKrzysztof Kosiński        my_list[1 : 10 : 2]
648*7249d1a6SKrzysztof Kosiński
649*7249d1a6SKrzysztof Kosiński``SPACES_AROUND_TUPLE_DELIMITERS``
650*7249d1a6SKrzysztof Kosiński    Adds a space after the opening '(' and before the ending ')' tuple delimiters.
651*7249d1a6SKrzysztof Kosiński
652*7249d1a6SKrzysztof Kosiński    .. code-block:: python
653*7249d1a6SKrzysztof Kosiński
654*7249d1a6SKrzysztof Kosiński        (1, 2, 3)
655*7249d1a6SKrzysztof Kosiński
656*7249d1a6SKrzysztof Kosiński    will be formatted as:
657*7249d1a6SKrzysztof Kosiński
658*7249d1a6SKrzysztof Kosiński    .. code-block:: python
659*7249d1a6SKrzysztof Kosiński
660*7249d1a6SKrzysztof Kosiński        ( 1, 2, 3 )
661*7249d1a6SKrzysztof Kosiński
662*7249d1a6SKrzysztof Kosiński``SPACES_BEFORE_COMMENT``
663*7249d1a6SKrzysztof Kosiński    The number of spaces required before a trailing comment.
664*7249d1a6SKrzysztof Kosiński    This can be a single value (representing the number of spaces
665*7249d1a6SKrzysztof Kosiński    before each trailing comment) or list of of values (representing
666*7249d1a6SKrzysztof Kosiński    alignment column values; trailing comments within a block will
667*7249d1a6SKrzysztof Kosiński    be aligned to the first column value that is greater than the maximum
668*7249d1a6SKrzysztof Kosiński    line length within the block). For example:
669*7249d1a6SKrzysztof Kosiński
670*7249d1a6SKrzysztof Kosiński    With ``spaces_before_comment=5``:
671*7249d1a6SKrzysztof Kosiński
672*7249d1a6SKrzysztof Kosiński    .. code-block:: python
673*7249d1a6SKrzysztof Kosiński
674*7249d1a6SKrzysztof Kosiński        1 + 1 # Adding values
675*7249d1a6SKrzysztof Kosiński
676*7249d1a6SKrzysztof Kosiński    will be formatted as:
677*7249d1a6SKrzysztof Kosiński
678*7249d1a6SKrzysztof Kosiński    .. code-block:: python
679*7249d1a6SKrzysztof Kosiński
680*7249d1a6SKrzysztof Kosiński        1 + 1     # Adding values <-- 5 spaces between the end of the statement and comment
681*7249d1a6SKrzysztof Kosiński
682*7249d1a6SKrzysztof Kosiński    With ``spaces_before_comment=15, 20``:
683*7249d1a6SKrzysztof Kosiński
684*7249d1a6SKrzysztof Kosiński    .. code-block:: python
685*7249d1a6SKrzysztof Kosiński
686*7249d1a6SKrzysztof Kosiński        1 + 1 # Adding values
687*7249d1a6SKrzysztof Kosiński        two + two # More adding
688*7249d1a6SKrzysztof Kosiński
689*7249d1a6SKrzysztof Kosiński        longer_statement # This is a longer statement
690*7249d1a6SKrzysztof Kosiński        short # This is a shorter statement
691*7249d1a6SKrzysztof Kosiński
692*7249d1a6SKrzysztof Kosiński        a_very_long_statement_that_extends_beyond_the_final_column # Comment
693*7249d1a6SKrzysztof Kosiński        short # This is a shorter statement
694*7249d1a6SKrzysztof Kosiński
695*7249d1a6SKrzysztof Kosiński    will be formatted as:
696*7249d1a6SKrzysztof Kosiński
697*7249d1a6SKrzysztof Kosiński    .. code-block:: python
698*7249d1a6SKrzysztof Kosiński
699*7249d1a6SKrzysztof Kosiński        1 + 1          # Adding values <-- end of line comments in block aligned to col 15
700*7249d1a6SKrzysztof Kosiński        two + two      # More adding
701*7249d1a6SKrzysztof Kosiński
702*7249d1a6SKrzysztof Kosiński        longer_statement    # This is a longer statement <-- end of line comments in block aligned to col 20
703*7249d1a6SKrzysztof Kosiński        short               # This is a shorter statement
704*7249d1a6SKrzysztof Kosiński
705*7249d1a6SKrzysztof Kosiński        a_very_long_statement_that_extends_beyond_the_final_column  # Comment <-- the end of line comments are aligned based on the line length
706*7249d1a6SKrzysztof Kosiński        short                                                       # This is a shorter statement
707*7249d1a6SKrzysztof Kosiński
708*7249d1a6SKrzysztof Kosiński``SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET``
709*7249d1a6SKrzysztof Kosiński    Insert a space between the ending comma and closing bracket of a list, etc.
710*7249d1a6SKrzysztof Kosiński
711*7249d1a6SKrzysztof Kosiński``SPACE_INSIDE_BRACKETS``
712*7249d1a6SKrzysztof Kosiński    Use spaces inside brackets, braces, and parentheses.  For example:
713*7249d1a6SKrzysztof Kosiński
714*7249d1a6SKrzysztof Kosiński    .. code-block:: python
715*7249d1a6SKrzysztof Kosiński
716*7249d1a6SKrzysztof Kosiński        method_call( 1 )
717*7249d1a6SKrzysztof Kosiński        my_dict[ 3 ][ 1 ][ get_index( *args, **kwargs ) ]
718*7249d1a6SKrzysztof Kosiński        my_set = { 1, 2, 3 }
719*7249d1a6SKrzysztof Kosiński
720*7249d1a6SKrzysztof Kosiński``SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED``
721*7249d1a6SKrzysztof Kosiński    Split before arguments if the argument list is terminated by a comma.
722*7249d1a6SKrzysztof Kosiński
723*7249d1a6SKrzysztof Kosiński``SPLIT_ALL_COMMA_SEPARATED_VALUES``
724*7249d1a6SKrzysztof Kosiński    If a comma separated list (``dict``, ``list``, ``tuple``, or function
725*7249d1a6SKrzysztof Kosiński    ``def``) is on a line that is too long, split such that each element
726*7249d1a6SKrzysztof Kosiński    is on a separate line.
727*7249d1a6SKrzysztof Kosiński
728*7249d1a6SKrzysztof Kosiński``SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES``
729*7249d1a6SKrzysztof Kosiński    Variation on ``SPLIT_ALL_COMMA_SEPARATED_VALUES`` in which, if a
730*7249d1a6SKrzysztof Kosiński    subexpression with a comma fits in its starting line, then the
731*7249d1a6SKrzysztof Kosiński    subexpression is not split. This avoids splits like the one for
732*7249d1a6SKrzysztof Kosiński    ``b`` in this code:
733*7249d1a6SKrzysztof Kosiński
734*7249d1a6SKrzysztof Kosiński    .. code-block:: python
735*7249d1a6SKrzysztof Kosiński
736*7249d1a6SKrzysztof Kosiński      abcdef(
737*7249d1a6SKrzysztof Kosiński          aReallyLongThing: int,
738*7249d1a6SKrzysztof Kosiński          b: [Int,
739*7249d1a6SKrzysztof Kosiński              Int])
740*7249d1a6SKrzysztof Kosiński
741*7249d1a6SKrzysztof Kosiński    With the new knob this is split as:
742*7249d1a6SKrzysztof Kosiński
743*7249d1a6SKrzysztof Kosiński    .. code-block:: python
744*7249d1a6SKrzysztof Kosiński
745*7249d1a6SKrzysztof Kosiński      abcdef(
746*7249d1a6SKrzysztof Kosiński          aReallyLongThing: int,
747*7249d1a6SKrzysztof Kosiński          b: [Int, Int])
748*7249d1a6SKrzysztof Kosiński
749*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_BITWISE_OPERATOR``
750*7249d1a6SKrzysztof Kosiński    Set to ``True`` to prefer splitting before ``&``, ``|`` or ``^`` rather
751*7249d1a6SKrzysztof Kosiński    than after.
752*7249d1a6SKrzysztof Kosiński
753*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_ARITHMETIC_OPERATOR``
754*7249d1a6SKrzysztof Kosiński    Set to ``True`` to prefer splitting before ``+``, ``-``, ``*``, ``/``, ``//``,
755*7249d1a6SKrzysztof Kosiński    or ``@`` rather than after.
756*7249d1a6SKrzysztof Kosiński
757*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_CLOSING_BRACKET``
758*7249d1a6SKrzysztof Kosiński    Split before the closing bracket if a ``list`` or ``dict`` literal doesn't
759*7249d1a6SKrzysztof Kosiński    fit on a single line.
760*7249d1a6SKrzysztof Kosiński
761*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_DICT_SET_GENERATOR``
762*7249d1a6SKrzysztof Kosiński    Split before a dictionary or set generator (comp_for). For example, note
763*7249d1a6SKrzysztof Kosiński    the split before the ``for``:
764*7249d1a6SKrzysztof Kosiński
765*7249d1a6SKrzysztof Kosiński    .. code-block:: python
766*7249d1a6SKrzysztof Kosiński
767*7249d1a6SKrzysztof Kosiński        foo = {
768*7249d1a6SKrzysztof Kosiński            variable: 'Hello world, have a nice day!'
769*7249d1a6SKrzysztof Kosiński            for variable in bar if variable != 42
770*7249d1a6SKrzysztof Kosiński        }
771*7249d1a6SKrzysztof Kosiński
772*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_DOT``
773*7249d1a6SKrzysztof Kosiński    Split before the ``.`` if we need to split a longer expression:
774*7249d1a6SKrzysztof Kosiński
775*7249d1a6SKrzysztof Kosiński    .. code-block:: python
776*7249d1a6SKrzysztof Kosiński
777*7249d1a6SKrzysztof Kosiński      foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d))
778*7249d1a6SKrzysztof Kosiński
779*7249d1a6SKrzysztof Kosiński    would reformat to something like:
780*7249d1a6SKrzysztof Kosiński
781*7249d1a6SKrzysztof Kosiński    .. code-block:: python
782*7249d1a6SKrzysztof Kosiński
783*7249d1a6SKrzysztof Kosiński      foo = ('This is a really long string: {}, {}, {}, {}'
784*7249d1a6SKrzysztof Kosiński             .format(a, b, c, d))
785*7249d1a6SKrzysztof Kosiński
786*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN``
787*7249d1a6SKrzysztof Kosiński    Split after the opening paren which surrounds an expression if it doesn't
788*7249d1a6SKrzysztof Kosiński    fit on a single line.
789*7249d1a6SKrzysztof Kosiński
790*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_FIRST_ARGUMENT``
791*7249d1a6SKrzysztof Kosiński    If an argument / parameter list is going to be split, then split before the
792*7249d1a6SKrzysztof Kosiński    first argument.
793*7249d1a6SKrzysztof Kosiński
794*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_LOGICAL_OPERATOR``
795*7249d1a6SKrzysztof Kosiński    Set to ``True`` to prefer splitting before ``and`` or ``or`` rather than
796*7249d1a6SKrzysztof Kosiński    after.
797*7249d1a6SKrzysztof Kosiński
798*7249d1a6SKrzysztof Kosiński``SPLIT_BEFORE_NAMED_ASSIGNS``
799*7249d1a6SKrzysztof Kosiński    Split named assignments onto individual lines.
800*7249d1a6SKrzysztof Kosiński
801*7249d1a6SKrzysztof Kosiński``SPLIT_COMPLEX_COMPREHENSION``
802*7249d1a6SKrzysztof Kosiński    For list comprehensions and generator expressions with multiple clauses
803*7249d1a6SKrzysztof Kosiński    (e.g multiple ``for`` calls, ``if`` filter expressions) and which need to
804*7249d1a6SKrzysztof Kosiński    be reflowed, split each clause onto its own line. For example:
805*7249d1a6SKrzysztof Kosiński
806*7249d1a6SKrzysztof Kosiński    .. code-block:: python
807*7249d1a6SKrzysztof Kosiński
808*7249d1a6SKrzysztof Kosiński      result = [
809*7249d1a6SKrzysztof Kosiński          a_var + b_var for a_var in xrange(1000) for b_var in xrange(1000)
810*7249d1a6SKrzysztof Kosiński          if a_var % b_var]
811*7249d1a6SKrzysztof Kosiński
812*7249d1a6SKrzysztof Kosiński    would reformat to something like:
813*7249d1a6SKrzysztof Kosiński
814*7249d1a6SKrzysztof Kosiński    .. code-block:: python
815*7249d1a6SKrzysztof Kosiński
816*7249d1a6SKrzysztof Kosiński      result = [
817*7249d1a6SKrzysztof Kosiński          a_var + b_var
818*7249d1a6SKrzysztof Kosiński          for a_var in xrange(1000)
819*7249d1a6SKrzysztof Kosiński          for b_var in xrange(1000)
820*7249d1a6SKrzysztof Kosiński          if a_var % b_var]
821*7249d1a6SKrzysztof Kosiński
822*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_AFTER_OPENING_BRACKET``
823*7249d1a6SKrzysztof Kosiński    The penalty for splitting right after the opening bracket.
824*7249d1a6SKrzysztof Kosiński
825*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_AFTER_UNARY_OPERATOR``
826*7249d1a6SKrzysztof Kosiński    The penalty for splitting the line after a unary operator.
827*7249d1a6SKrzysztof Kosiński
828*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_ARITHMETIC_OPERATOR``
829*7249d1a6SKrzysztof Kosiński    The penalty of splitting the line around the ``+``, ``-``, ``*``, ``/``,
830*7249d1a6SKrzysztof Kosiński    ``//``, ``%``, and ``@`` operators.
831*7249d1a6SKrzysztof Kosiński
832*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_BEFORE_IF_EXPR``
833*7249d1a6SKrzysztof Kosiński    The penalty for splitting right before an ``if`` expression.
834*7249d1a6SKrzysztof Kosiński
835*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_BITWISE_OPERATOR``
836*7249d1a6SKrzysztof Kosiński    The penalty of splitting the line around the ``&``, ``|``, and ``^``
837*7249d1a6SKrzysztof Kosiński    operators.
838*7249d1a6SKrzysztof Kosiński
839*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_COMPREHENSION``
840*7249d1a6SKrzysztof Kosiński    The penalty for splitting a list comprehension or generator expression.
841*7249d1a6SKrzysztof Kosiński
842*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_EXCESS_CHARACTER``
843*7249d1a6SKrzysztof Kosiński    The penalty for characters over the column limit.
844*7249d1a6SKrzysztof Kosiński
845*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT``
846*7249d1a6SKrzysztof Kosiński    The penalty incurred by adding a line split to the logical line. The more
847*7249d1a6SKrzysztof Kosiński    line splits added the higher the penalty.
848*7249d1a6SKrzysztof Kosiński
849*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_IMPORT_NAMES``
850*7249d1a6SKrzysztof Kosiński    The penalty of splitting a list of ``import as`` names. For example:
851*7249d1a6SKrzysztof Kosiński
852*7249d1a6SKrzysztof Kosiński    .. code-block:: python
853*7249d1a6SKrzysztof Kosiński
854*7249d1a6SKrzysztof Kosiński      from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
855*7249d1a6SKrzysztof Kosiński                                                                long_argument_2,
856*7249d1a6SKrzysztof Kosiński                                                                long_argument_3)
857*7249d1a6SKrzysztof Kosiński
858*7249d1a6SKrzysztof Kosiński    would reformat to something like:
859*7249d1a6SKrzysztof Kosiński
860*7249d1a6SKrzysztof Kosiński    .. code-block:: python
861*7249d1a6SKrzysztof Kosiński
862*7249d1a6SKrzysztof Kosiński      from a_very_long_or_indented_module_name_yada_yad import (
863*7249d1a6SKrzysztof Kosiński          long_argument_1, long_argument_2, long_argument_3)
864*7249d1a6SKrzysztof Kosiński
865*7249d1a6SKrzysztof Kosiński``SPLIT_PENALTY_LOGICAL_OPERATOR``
866*7249d1a6SKrzysztof Kosiński    The penalty of splitting the line around the ``and`` and ``or`` operators.
867*7249d1a6SKrzysztof Kosiński
868*7249d1a6SKrzysztof Kosiński``USE_TABS``
869*7249d1a6SKrzysztof Kosiński    Use the Tab character for indentation.
870*7249d1a6SKrzysztof Kosiński
871*7249d1a6SKrzysztof Kosiński(Potentially) Frequently Asked Questions
872*7249d1a6SKrzysztof Kosiński========================================
873*7249d1a6SKrzysztof Kosiński
874*7249d1a6SKrzysztof Kosiński--------------------------------------------
875*7249d1a6SKrzysztof KosińskiWhy does YAPF destroy my awesome formatting?
876*7249d1a6SKrzysztof Kosiński--------------------------------------------
877*7249d1a6SKrzysztof Kosiński
878*7249d1a6SKrzysztof KosińskiYAPF tries very hard to get the formatting correct. But for some code, it won't
879*7249d1a6SKrzysztof Kosińskibe as good as hand-formatting. In particular, large data literals may become
880*7249d1a6SKrzysztof Kosińskihorribly disfigured under YAPF.
881*7249d1a6SKrzysztof Kosiński
882*7249d1a6SKrzysztof KosińskiThe reasons for this are manyfold. In short, YAPF is simply a tool to help
883*7249d1a6SKrzysztof Kosińskiwith development. It will format things to coincide with the style guide, but
884*7249d1a6SKrzysztof Kosińskithat may not equate with readability.
885*7249d1a6SKrzysztof Kosiński
886*7249d1a6SKrzysztof KosińskiWhat can be done to alleviate this situation is to indicate regions YAPF should
887*7249d1a6SKrzysztof Kosińskiignore when reformatting something:
888*7249d1a6SKrzysztof Kosiński
889*7249d1a6SKrzysztof Kosiński.. code-block:: python
890*7249d1a6SKrzysztof Kosiński
891*7249d1a6SKrzysztof Kosiński    # yapf: disable
892*7249d1a6SKrzysztof Kosiński    FOO = {
893*7249d1a6SKrzysztof Kosiński        # ... some very large, complex data literal.
894*7249d1a6SKrzysztof Kosiński    }
895*7249d1a6SKrzysztof Kosiński
896*7249d1a6SKrzysztof Kosiński    BAR = [
897*7249d1a6SKrzysztof Kosiński        # ... another large data literal.
898*7249d1a6SKrzysztof Kosiński    ]
899*7249d1a6SKrzysztof Kosiński    # yapf: enable
900*7249d1a6SKrzysztof Kosiński
901*7249d1a6SKrzysztof KosińskiYou can also disable formatting for a single literal like this:
902*7249d1a6SKrzysztof Kosiński
903*7249d1a6SKrzysztof Kosiński.. code-block:: python
904*7249d1a6SKrzysztof Kosiński
905*7249d1a6SKrzysztof Kosiński    BAZ = {
906*7249d1a6SKrzysztof Kosiński        (1, 2, 3, 4),
907*7249d1a6SKrzysztof Kosiński        (5, 6, 7, 8),
908*7249d1a6SKrzysztof Kosiński        (9, 10, 11, 12),
909*7249d1a6SKrzysztof Kosiński    }  # yapf: disable
910*7249d1a6SKrzysztof Kosiński
911*7249d1a6SKrzysztof KosińskiTo preserve the nice dedented closing brackets, use the
912*7249d1a6SKrzysztof Kosiński``dedent_closing_brackets`` in your style. Note that in this case all
913*7249d1a6SKrzysztof Kosińskibrackets, including function definitions and calls, are going to use
914*7249d1a6SKrzysztof Kosińskithat style.  This provides consistency across the formatted codebase.
915*7249d1a6SKrzysztof Kosiński
916*7249d1a6SKrzysztof Kosiński-------------------------------
917*7249d1a6SKrzysztof KosińskiWhy Not Improve Existing Tools?
918*7249d1a6SKrzysztof Kosiński-------------------------------
919*7249d1a6SKrzysztof Kosiński
920*7249d1a6SKrzysztof KosińskiWe wanted to use clang-format's reformatting algorithm. It's very powerful and
921*7249d1a6SKrzysztof Kosińskidesigned to come up with the best formatting possible. Existing tools were
922*7249d1a6SKrzysztof Kosińskicreated with different goals in mind, and would require extensive modifications
923*7249d1a6SKrzysztof Kosińskito convert to using clang-format's algorithm.
924*7249d1a6SKrzysztof Kosiński
925*7249d1a6SKrzysztof Kosiński-----------------------------
926*7249d1a6SKrzysztof KosińskiCan I Use YAPF In My Program?
927*7249d1a6SKrzysztof Kosiński-----------------------------
928*7249d1a6SKrzysztof Kosiński
929*7249d1a6SKrzysztof KosińskiPlease do! YAPF was designed to be used as a library as well as a command line
930*7249d1a6SKrzysztof Kosińskitool. This means that a tool or IDE plugin is free to use YAPF.
931*7249d1a6SKrzysztof Kosiński
932*7249d1a6SKrzysztof Kosiński-----------------------------------------
933*7249d1a6SKrzysztof KosińskiI still get non Pep8 compliant code! Why?
934*7249d1a6SKrzysztof Kosiński-----------------------------------------
935*7249d1a6SKrzysztof Kosiński
936*7249d1a6SKrzysztof KosińskiYAPF tries very hard to be fully PEP 8 compliant. However, it is paramount
937*7249d1a6SKrzysztof Kosińskito not risk altering the semantics of your code. Thus, YAPF tries to be as
938*7249d1a6SKrzysztof Kosińskisafe as possible and does not change the token stream
939*7249d1a6SKrzysztof Kosiński(e.g., by adding parentheses).
940*7249d1a6SKrzysztof KosińskiAll these cases however, can be easily fixed manually. For instance,
941*7249d1a6SKrzysztof Kosiński
942*7249d1a6SKrzysztof Kosiński.. code-block:: python
943*7249d1a6SKrzysztof Kosiński
944*7249d1a6SKrzysztof Kosiński    from my_package import my_function_1, my_function_2, my_function_3, my_function_4, my_function_5
945*7249d1a6SKrzysztof Kosiński
946*7249d1a6SKrzysztof Kosiński    FOO = my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 + my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8
947*7249d1a6SKrzysztof Kosiński
948*7249d1a6SKrzysztof Kosińskiwon't be split, but you can easily get it right by just adding parentheses:
949*7249d1a6SKrzysztof Kosiński
950*7249d1a6SKrzysztof Kosiński.. code-block:: python
951*7249d1a6SKrzysztof Kosiński
952*7249d1a6SKrzysztof Kosiński    from my_package import (my_function_1, my_function_2, my_function_3,
953*7249d1a6SKrzysztof Kosiński                            my_function_4, my_function_5)
954*7249d1a6SKrzysztof Kosiński
955*7249d1a6SKrzysztof Kosiński    FOO = (my_variable_1 + my_variable_2 + my_variable_3 + my_variable_4 +
956*7249d1a6SKrzysztof Kosiński           my_variable_5 + my_variable_6 + my_variable_7 + my_variable_8)
957*7249d1a6SKrzysztof Kosiński
958*7249d1a6SKrzysztof KosińskiGory Details
959*7249d1a6SKrzysztof Kosiński============
960*7249d1a6SKrzysztof Kosiński
961*7249d1a6SKrzysztof Kosiński----------------
962*7249d1a6SKrzysztof KosińskiAlgorithm Design
963*7249d1a6SKrzysztof Kosiński----------------
964*7249d1a6SKrzysztof Kosiński
965*7249d1a6SKrzysztof KosińskiThe main data structure in YAPF is the ``LogicalLine`` object. It holds a list
966*7249d1a6SKrzysztof Kosińskiof ``FormatToken``\s, that we would want to place on a single line if there
967*7249d1a6SKrzysztof Kosińskiwere no column limit. An exception being a comment in the middle of an
968*7249d1a6SKrzysztof Kosińskiexpression statement will force the line to be formatted on more than one line.
969*7249d1a6SKrzysztof KosińskiThe formatter works on one ``LogicalLine`` object at a time.
970*7249d1a6SKrzysztof Kosiński
971*7249d1a6SKrzysztof KosińskiAn ``LogicalLine`` typically won't affect the formatting of lines before or
972*7249d1a6SKrzysztof Kosińskiafter it. There is a part of the algorithm that may join two or more
973*7249d1a6SKrzysztof Kosiński``LogicalLine``\s into one line. For instance, an if-then statement with a
974*7249d1a6SKrzysztof Kosińskishort body can be placed on a single line:
975*7249d1a6SKrzysztof Kosiński
976*7249d1a6SKrzysztof Kosiński.. code-block:: python
977*7249d1a6SKrzysztof Kosiński
978*7249d1a6SKrzysztof Kosiński    if a == 42: continue
979*7249d1a6SKrzysztof Kosiński
980*7249d1a6SKrzysztof KosińskiYAPF's formatting algorithm creates a weighted tree that acts as the solution
981*7249d1a6SKrzysztof Kosińskispace for the algorithm. Each node in the tree represents the result of a
982*7249d1a6SKrzysztof Kosińskiformatting decision --- i.e., whether to split or not to split before a token.
983*7249d1a6SKrzysztof KosińskiEach formatting decision has a cost associated with it. Therefore, the cost is
984*7249d1a6SKrzysztof Kosińskirealized on the edge between two nodes. (In reality, the weighted tree doesn't
985*7249d1a6SKrzysztof Kosińskihave separate edge objects, so the cost resides on the nodes themselves.)
986*7249d1a6SKrzysztof Kosiński
987*7249d1a6SKrzysztof KosińskiFor example, take the following Python code snippet. For the sake of this
988*7249d1a6SKrzysztof Kosińskiexample, assume that line (1) violates the column limit restriction and needs to
989*7249d1a6SKrzysztof Kosińskibe reformatted.
990*7249d1a6SKrzysztof Kosiński
991*7249d1a6SKrzysztof Kosiński.. code-block:: python
992*7249d1a6SKrzysztof Kosiński
993*7249d1a6SKrzysztof Kosiński    def xxxxxxxxxxx(aaaaaaaaaaaa, bbbbbbbbb, cccccccc, dddddddd, eeeeee):  # 1
994*7249d1a6SKrzysztof Kosiński        pass                                                               # 2
995*7249d1a6SKrzysztof Kosiński
996*7249d1a6SKrzysztof KosińskiFor line (1), the algorithm will build a tree where each node (a
997*7249d1a6SKrzysztof Kosiński``FormattingDecisionState`` object) is the state of the line at that token given
998*7249d1a6SKrzysztof Kosińskithe decision to split before the token or not. Note: the ``FormatDecisionState``
999*7249d1a6SKrzysztof Kosińskiobjects are copied by value so each node in the graph is unique and a change in
1000*7249d1a6SKrzysztof Kosińskione doesn't affect other nodes.
1001*7249d1a6SKrzysztof Kosiński
1002*7249d1a6SKrzysztof KosińskiHeuristics are used to determine the costs of splitting or not splitting.
1003*7249d1a6SKrzysztof KosińskiBecause a node holds the state of the tree up to a token's insertion, it can
1004*7249d1a6SKrzysztof Kosińskieasily determine if a splitting decision will violate one of the style
1005*7249d1a6SKrzysztof Kosińskirequirements. For instance, the heuristic is able to apply an extra penalty to
1006*7249d1a6SKrzysztof Kosińskithe edge when not splitting between the previous token and the one being added.
1007*7249d1a6SKrzysztof Kosiński
1008*7249d1a6SKrzysztof KosińskiThere are some instances where we will never want to split the line, because
1009*7249d1a6SKrzysztof Kosińskidoing so will always be detrimental (i.e., it will require a backslash-newline,
1010*7249d1a6SKrzysztof Kosińskiwhich is very rarely desirable). For line (1), we will never want to split the
1011*7249d1a6SKrzysztof Kosińskifirst three tokens: ``def``, ``xxxxxxxxxxx``, and ``(``. Nor will we want to
1012*7249d1a6SKrzysztof Kosińskisplit between the ``)`` and the ``:`` at the end. These regions are said to be
1013*7249d1a6SKrzysztof Kosiński"unbreakable." This is reflected in the tree by there not being a "split"
1014*7249d1a6SKrzysztof Kosińskidecision (left hand branch) within the unbreakable region.
1015*7249d1a6SKrzysztof Kosiński
1016*7249d1a6SKrzysztof KosińskiNow that we have the tree, we determine what the "best" formatting is by finding
1017*7249d1a6SKrzysztof Kosińskithe path through the tree with the lowest cost.
1018*7249d1a6SKrzysztof Kosiński
1019*7249d1a6SKrzysztof KosińskiAnd that's it!
1020