====
YAPF
====

.. image:: https://badge.fury.io/py/yapf.svg
    :target: https://badge.fury.io/py/yapf
    :alt: PyPI version

.. image:: https://github.com/google/yapf/actions/workflows/ci.yml/badge.svg
    :target: https://github.com/google/yapf/actions
    :alt: Build status

.. image:: https://coveralls.io/repos/google/yapf/badge.svg?branch=main
    :target: https://coveralls.io/r/google/yapf?branch=main
    :alt: Coverage status


Introduction
============

Most of the current formatters for Python --- e.g., autopep8, and pep8ify ---
are made to remove lint errors from code. This has some obvious limitations.
For instance, code that conforms to the PEP 8 guidelines may not be
reformatted.  But it doesn't mean that the code looks good.

YAPF takes a different approach. It's based off of `'clang-format' <https://cl
ang.llvm.org/docs/ClangFormat.html>`_, developed by Daniel Jasper. In essence,
the algorithm takes the code and reformats it to the best formatting that
conforms to the style guide, even if the original code didn't violate the
style guide. The idea is also similar to the `'gofmt' <https://golang.org/cmd/
gofmt/>`_ tool for the Go programming language: end all holy wars about
formatting - if the whole codebase of a project is simply piped through YAPF
whenever modifications are made, the style remains consistent throughout the
project and there's no point arguing about style in every code review.

The ultimate goal is that the code YAPF produces is as good as the code that a
programmer would write if they were following the style guide. It takes away
some of the drudgery of maintaining your code.

.. footer::

    YAPF is not an official Google product (experimental or otherwise), it is
    just code that happens to be owned by Google.

.. contents::


Installation
============

To install YAPF from PyPI:

.. code-block:: shell

    $ pip install yapf

YAPF is still considered in "alpha" stage, and the released version may change
often; therefore, the best way to keep up-to-date with the latest development
is to clone this repository.

Note that if you intend to use YAPF as a command-line tool rather than as a
library, installation is not necessary. YAPF supports being run as a directory
by the Python interpreter. If you cloned/unzipped YAPF into ``DIR``, it's
possible to run:

.. code-block:: shell

    $ PYTHONPATH=DIR python DIR/yapf [options] ...


Python versions
===============

YAPF supports Python 3.7+.

YAPF requires the code it formats to be valid Python for the version YAPF itself
runs under. So if formatting 3.7 Python run YAPF under 3.7


Usage
=====

Options::

    usage: yapf [-h] [-v] [-d | -i | -q] [-r | -l START-END] [-e PATTERN]
                [--style STYLE] [--style-help] [--no-local-style] [-p]
                [-vv]
                [files ...]

    Formatter for Python code.

    positional arguments:
      files                 reads from stdin when no files are specified.

    optional arguments:
      -h, --help            show this help message and exit
      -v, --version         show program's version number and exit
      -d, --diff            print the diff for the fixed source
      -i, --in-place        make changes to files in place
      -q, --quiet           output nothing and set return value
      -r, --recursive       run recursively over directories
      -l START-END, --lines START-END
                            range of lines to reformat, one-based
      -e PATTERN, --exclude PATTERN
                            patterns for files to exclude from formatting
      --style STYLE         specify formatting style: either a style name (for
                            example "pep8" or "google"), or the name of a file
                            with style settings.  The default is pep8 unless a
                            .style.yapf or setup.cfg or pyproject.toml file
                            located in the same directory as the source or one
                            of its parent directories (for stdin, the current
                            directory is used).
      --style-help          show style settings and exit; this output can be
                            saved to .style.yapf to make your settings
                            permanent
      --no-local-style      don't search for local style definition
      -p, --parallel        run YAPF in parallel when formatting multiple
                            files. Requires concurrent.futures in Python 2.X
      -m, --print-modified  print out file names of modified files
      -vv, --verbose        print out file names while processing


------------
Return Codes
------------

Normally YAPF returns zero on successful program termination and non-zero otherwise.

If ``--diff`` is supplied, YAPF returns zero when no changes were necessary, non-zero
otherwise (including program error). You can use this in a CI workflow to test that code
has been YAPF-formatted.

---------------------------------------------------------------
Excluding files from formatting (.yapfignore or pyproject.toml)
---------------------------------------------------------------

In addition to exclude patterns provided on commandline, YAPF looks for additional
patterns specified in a file named ``.yapfignore`` or ``pyproject.toml`` located in the
working directory from which YAPF is invoked.

``.yapfignore``'s syntax is similar to UNIX's filename pattern matching::

    *       matches everything
    ?       matches any single character
    [seq]   matches any character in seq
    [!seq]  matches any character not in seq

Note that no entry should begin with `./`.

If you use ``pyproject.toml``, exclude patterns are specified by ``ignore_patterns`` key
in ``[tool.yapfignore]`` section. For example:

.. code-block:: ini

   [tool.yapfignore]
   ignore_patterns = [
     "temp/**/*.py",
     "temp2/*.py"
   ]

Formatting style
================

The formatting style used by YAPF is configurable and there are many "knobs"
that can be used to tune how YAPF does formatting. See the ``style.py`` module
for the full list.

To control the style, run YAPF with the ``--style`` argument. It accepts one of
the predefined styles (e.g., ``pep8`` or ``google``), a path to a configuration
file that specifies the desired style, or a dictionary of key/value pairs.

The config file is a simple listing of (case-insensitive) ``key = value`` pairs
with a ``[style]`` heading. For example:

.. code-block:: ini

    [style]
    based_on_style = pep8
    spaces_before_comment = 4
    split_before_logical_operator = true

The ``based_on_style`` setting determines which of the predefined styles this
custom style is based on (think of it like subclassing). Four
styles are predefined:

- ``pep8`` (default)
- ``google`` (based off of the `Google Python Style Guide`_)
- ``yapf`` (for use with Google open source projects)
- ``facebook``

.. _`Google Python Style Guide`: https://github.com/google/styleguide/blob/gh-pages/pyguide.md

See ``_STYLE_NAME_TO_FACTORY`` in style.py_ for details.

.. _style.py: https://github.com/google/yapf/blob/main/yapf/yapflib/style.py

It's also possible to do the same on the command line with a dictionary. For
example:

.. code-block:: shell

    --style='{based_on_style: pep8, indent_width: 2}'

This will take the ``pep8`` base style and modify it to have two space
indentations.

YAPF will search for the formatting style in the following manner:

1. Specified on the command line
2. In the ``[style]`` section of a ``.style.yapf`` file in either the current
   directory or one of its parent directories.
3. In the ``[yapf]`` section of a ``setup.cfg`` file in either the current
   directory or one of its parent directories.
4. In the ``[tool.yapf]`` section of a ``pyproject.toml`` file in either the current
   directory or one of its parent directories.
5. In the ``[style]`` section of a ``~/.config/yapf/style`` file in your home
   directory.

If none of those files are found, the default style is used (PEP8).


Example
=======

An example of the type of formatting that YAPF can do, it will take this ugly
code:

.. code-block:: python

    x = {  'a':37,'b':42,

    'c':927}

    y = 'hello ''world'
    z = 'hello '+'world'
    a = 'hello {}'.format('world')
    class foo  (     object  ):
      def f    (self   ):
        return       37*-+2
      def g(self, x,y=42):
          return y
    def f  (   a ) :
      return      37+-+a[42-x :  y**3]

and reformat it into:

.. code-block:: python

    x = {'a': 37, 'b': 42, 'c': 927}

    y = 'hello ' 'world'
    z = 'hello ' + 'world'
    a = 'hello {}'.format('world')


    class foo(object):
        def f(self):
            return 37 * -+2

        def g(self, x, y=42):
            return y


    def f(a):
        return 37 + -+a[42 - x:y**3]


Example as a module
===================

The two main APIs for calling YAPF are ``FormatCode`` and ``FormatFile``, these
share several arguments which are described below:

.. code-block:: python

    >>> from yapf.yapflib.yapf_api import FormatCode  # reformat a string of code

    >>> formatted_code, changed = FormatCode("f ( a = 1, b = 2 )")
    >>> formatted_code
    'f(a=1, b=2)\n'
    >>> changed
    True

A ``style_config`` argument: Either a style name or a path to a file that contains
formatting style settings. If None is specified, use the default style
as set in ``style.DEFAULT_STYLE_FACTORY``.

.. code-block:: python

    >>> FormatCode("def g():\n  return True", style_config='pep8')[0]
    'def g():\n    return True\n'

A ``lines`` argument: A list of tuples of lines (ints), [start, end],
that we want to format. The lines are 1-based indexed. It can be used by
third-party code (e.g., IDEs) when reformatting a snippet of code rather
than a whole file.

.. code-block:: python

    >>> FormatCode("def g( ):\n    a=1\n    b = 2\n    return a==b", lines=[(1, 1), (2, 3)])[0]
    'def g():\n    a = 1\n    b = 2\n    return a==b\n'

A ``print_diff`` (bool): Instead of returning the reformatted source, return a
diff that turns the formatted source into reformatted source.

.. code-block:: python

    >>> print(FormatCode("a==b", filename="foo.py", print_diff=True)[0])
    --- foo.py (original)
    +++ foo.py (reformatted)
    @@ -1 +1 @@
    -a==b
    +a == b

Note: the ``filename`` argument for ``FormatCode`` is what is inserted into
the diff, the default is ``<unknown>``.

``FormatFile`` returns reformatted code from the passed file along with its encoding:

.. code-block:: python

    >>> from yapf.yapflib.yapf_api import FormatFile  # reformat a file

    >>> print(open("foo.py").read())  # contents of file
    a==b

    >>> reformatted_code, encoding, changed = FormatFile("foo.py")
    >>> formatted_code
    'a == b\n'
    >>> encoding
    'utf-8'
    >>> changed
    True

The ``in_place`` argument saves the reformatted code back to the file:

.. code-block:: python

    >>> FormatFile("foo.py", in_place=True)[:2]
    (None, 'utf-8')

    >>> print(open("foo.py").read())  # contents of file (now fixed)
    a == b

Formatting diffs
================

Options::

    usage: yapf-diff [-h] [-i] [-p NUM] [--regex PATTERN] [--iregex PATTERN][-v]
                     [--style STYLE] [--binary BINARY]

    This script reads input from a unified diff and reformats all the changed
    lines. This is useful to reformat all the lines touched by a specific patch.
    Example usage for git/svn users:

      git diff -U0 --no-color --relative HEAD^ | yapf-diff -i
      svn diff --diff-cmd=diff -x-U0 | yapf-diff -p0 -i

    It should be noted that the filename contained in the diff is used
    unmodified to determine the source file to update. Users calling this script
    directly should be careful to ensure that the path in the diff is correct
    relative to the current working directory.

    optional arguments:
      -h, --help            show this help message and exit
      -i, --in-place        apply edits to files instead of displaying a diff
      -p NUM, --prefix NUM  strip the smallest prefix containing P slashes
      --regex PATTERN       custom pattern selecting file paths to reformat
                            (case sensitive, overrides -iregex)
      --iregex PATTERN      custom pattern selecting file paths to reformat
                            (case insensitive, overridden by -regex)
      -v, --verbose         be more verbose, ineffective without -i
      --style STYLE         specify formatting style: either a style name (for
                            example "pep8" or "google"), or the name of a file
                            with style settings. The default is pep8 unless a
                            .style.yapf or setup.cfg or pyproject.toml file
                            located in the same directory as the source or one of
                            its parent directories (for stdin, the current
                            directory is used).
      --binary BINARY       location of binary to use for YAPF

Knobs
=====

``ALIGN_CLOSING_BRACKET_WITH_VISUAL_INDENT``
    Align closing bracket with visual indentation.

``ALLOW_MULTILINE_LAMBDAS``
    Allow lambdas to be formatted on more than one line.

``ALLOW_MULTILINE_DICTIONARY_KEYS``
    Allow dictionary keys to exist on multiple lines. For example:

    .. code-block:: python

        x = {
            ('this is the first element of a tuple',
             'this is the second element of a tuple'):
                 value,
        }

``ALLOW_SPLIT_BEFORE_DEFAULT_OR_NAMED_ASSIGNS``
    Allow splitting before a default / named assignment in an argument list.

``ALLOW_SPLIT_BEFORE_DICT_VALUE``
    Allow splits before the dictionary value.

``ARITHMETIC_PRECEDENCE_INDICATION``
    Let spacing indicate operator precedence. For example:

    .. code-block:: python

        a = 1 * 2 + 3 / 4
        b = 1 / 2 - 3 * 4
        c = (1 + 2) * (3 - 4)
        d = (1 - 2) / (3 + 4)
        e = 1 * 2 - 3
        f = 1 + 2 + 3 + 4

    will be formatted as follows to indicate precedence:

    .. code-block:: python

        a = 1*2 + 3/4
        b = 1/2 - 3*4
        c = (1+2) * (3-4)
        d = (1-2) / (3+4)
        e = 1*2 - 3
        f = 1 + 2 + 3 + 4

``BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF``
    Insert a blank line before a ``def`` or ``class`` immediately nested within
    another ``def`` or ``class``. For example:

    .. code-block:: python

        class Foo:
                           # <------ this blank line
            def method():
                pass

``BLANK_LINE_BEFORE_MODULE_DOCSTRING``
    Insert a blank line before a module docstring.

``BLANK_LINE_BEFORE_CLASS_DOCSTRING``
    Insert a blank line before a class-level docstring.

``BLANK_LINES_AROUND_TOP_LEVEL_DEFINITION``
    Sets the number of desired blank lines surrounding top-level function and
    class definitions. For example:

    .. code-block:: python

        class Foo:
            pass
                           # <------ having two blank lines here
                           # <------ is the default setting
        class Bar:
            pass

``BLANK_LINES_BETWEEN_TOP_LEVEL_IMPORTS_AND_VARIABLES``
    Sets the number of desired blank lines between top-level imports and
    variable definitions. Useful for compatibility with tools like isort.

``COALESCE_BRACKETS``
    Do not split consecutive brackets. Only relevant when
    ``DEDENT_CLOSING_BRACKETS`` or ``INDENT_CLOSING_BRACKETS``
    is set. For example:

    .. code-block:: python

        call_func_that_takes_a_dict(
            {
                'key1': 'value1',
                'key2': 'value2',
            }
        )

    would reformat to:

    .. code-block:: python

        call_func_that_takes_a_dict({
            'key1': 'value1',
            'key2': 'value2',
        })


``COLUMN_LIMIT``
    The column limit (or max line-length)

``CONTINUATION_ALIGN_STYLE``
    The style for continuation alignment. Possible values are:

    - ``SPACE``: Use spaces for continuation alignment. This is default
      behavior.
    - ``FIXED``: Use fixed number (CONTINUATION_INDENT_WIDTH) of columns
      (ie: CONTINUATION_INDENT_WIDTH/INDENT_WIDTH tabs or CONTINUATION_INDENT_WIDTH
      spaces) for continuation alignment.
    - ``VALIGN-RIGHT``: Vertically align continuation lines to multiple of
      INDENT_WIDTH columns. Slightly right (one tab or a few spaces) if cannot
      vertically align continuation lines with indent characters.

``CONTINUATION_INDENT_WIDTH``
    Indent width used for line continuations.

``DEDENT_CLOSING_BRACKETS``
    Put closing brackets on a separate line, dedented, if the bracketed
    expression can't fit in a single line. Applies to all kinds of brackets,
    including function definitions and calls. For example:

    .. code-block:: python

        config = {
            'key1': 'value1',
            'key2': 'value2',
        }  # <--- this bracket is dedented and on a separate line

        time_series = self.remote_client.query_entity_counters(
            entity='dev3246.region1',
            key='dns.query_latency_tcp',
            transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
            start_ts=now()-timedelta(days=3),
            end_ts=now(),
        )  # <--- this bracket is dedented and on a separate line

``DISABLE_ENDING_COMMA_HEURISTIC``
    Disable the heuristic which places each list element on a separate line if
    the list is comma-terminated.

``EACH_DICT_ENTRY_ON_SEPARATE_LINE``
    Place each dictionary entry onto its own line.

``FORCE_MULTILINE_DICT``
    Respect EACH_DICT_ENTRY_ON_SEPARATE_LINE even if the line is shorter than
    COLUMN_LIMIT.

``I18N_COMMENT``
    The regex for an internationalization comment. The presence of this comment
    stops reformatting of that line, because the comments are required to be
    next to the string they translate.

``I18N_FUNCTION_CALL``
    The internationalization function call names. The presence of this function
    stops reformatting on that line, because the string it has cannot be moved
    away from the i18n comment.

``INDENT_DICTIONARY_VALUE``
    Indent the dictionary value if it cannot fit on the same line as the
    dictionary key. For example:

    .. code-block:: python

        config = {
            'key1':
                'value1',
            'key2': value1 +
                    value2,
        }

``INDENT_WIDTH``
    The number of columns to use for indentation.

``INDENT_BLANK_LINES``
    Set to ``True`` to prefer indented blank lines rather than empty

``INDENT_CLOSING_BRACKETS``
    Put closing brackets on a separate line, indented, if the bracketed
    expression can't fit in a single line. Applies to all kinds of brackets,
    including function definitions and calls. For example:

    .. code-block:: python

        config = {
            'key1': 'value1',
            'key2': 'value2',
            }  # <--- this bracket is indented and on a separate line

        time_series = self.remote_client.query_entity_counters(
            entity='dev3246.region1',
            key='dns.query_latency_tcp',
            transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
            start_ts=now()-timedelta(days=3),
            end_ts=now(),
            )  # <--- this bracket is indented and on a separate line

``JOIN_MULTIPLE_LINES``
    Join short lines into one line. E.g., single line ``if`` statements.

``NO_SPACES_AROUND_SELECTED_BINARY_OPERATORS``
    Do not include spaces around selected binary operators. For example:

    .. code-block:: python

        1 + 2 * 3 - 4 / 5

    will be formatted as follows when configured with ``*``, ``/``:

    .. code-block:: python

        1 + 2*3 - 4/5

``SPACES_AROUND_POWER_OPERATOR``
    Set to ``True`` to prefer using spaces around ``**``.

``SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN``
    Set to ``True`` to prefer spaces around the assignment operator for default
    or keyword arguments.

``SPACES_AROUND_DICT_DELIMITERS``
    Adds a space after the opening '{' and before the ending '}' dict delimiters.

    .. code-block:: python

        {1: 2}

    will be formatted as:

    .. code-block:: python

        { 1: 2 }

``SPACES_AROUND_LIST_DELIMITERS``
    Adds a space after the opening '[' and before the ending ']' list delimiters.

    .. code-block:: python

        [1, 2]

    will be formatted as:

    .. code-block:: python

        [ 1, 2 ]

``SPACES_AROUND_SUBSCRIPT_COLON``
    Use spaces around the subscript / slice operator.  For example:

    .. code-block:: python

        my_list[1 : 10 : 2]

``SPACES_AROUND_TUPLE_DELIMITERS``
    Adds a space after the opening '(' and before the ending ')' tuple delimiters.

    .. code-block:: python

        (1, 2, 3)

    will be formatted as:

    .. code-block:: python

        ( 1, 2, 3 )

``SPACES_BEFORE_COMMENT``
    The number of spaces required before a trailing comment.
    This can be a single value (representing the number of spaces
    before each trailing comment) or list of values (representing
    alignment column values; trailing comments within a block will
    be aligned to the first column value that is greater than the maximum
    line length within the block).

    **Note:** Lists of values may need to be quoted in some contexts
    (eg. shells or editor config files).

    For example:

    With ``spaces_before_comment=5``:

    .. code-block:: python

        1 + 1 # Adding values

    will be formatted as:

    .. code-block:: python

        1 + 1     # Adding values <-- 5 spaces between the end of the statement and comment

    With ``spaces_before_comment="15, 20"``:

    .. code-block:: python

        1 + 1 # Adding values
        two + two # More adding

        longer_statement # This is a longer statement
        short # This is a shorter statement

        a_very_long_statement_that_extends_beyond_the_final_column # Comment
        short # This is a shorter statement

    will be formatted as:

    .. code-block:: python

        1 + 1          # Adding values <-- end of line comments in block aligned to col 15
        two + two      # More adding

        longer_statement    # This is a longer statement <-- end of line comments in block aligned to col 20
        short               # This is a shorter statement

        a_very_long_statement_that_extends_beyond_the_final_column  # Comment <-- the end of line comments are aligned based on the line length
        short                                                       # This is a shorter statement

``SPACE_BETWEEN_ENDING_COMMA_AND_CLOSING_BRACKET``
    Insert a space between the ending comma and closing bracket of a list, etc.

``SPACE_INSIDE_BRACKETS``
    Use spaces inside brackets, braces, and parentheses.  For example:

    .. code-block:: python

        method_call( 1 )
        my_dict[ 3 ][ 1 ][ get_index( *args, **kwargs ) ]
        my_set = { 1, 2, 3 }

``SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED``
    Split before arguments if the argument list is terminated by a comma.

``SPLIT_ALL_COMMA_SEPARATED_VALUES``
    If a comma separated list (``dict``, ``list``, ``tuple``, or function
    ``def``) is on a line that is too long, split such that each element
    is on a separate line.

``SPLIT_ALL_TOP_LEVEL_COMMA_SEPARATED_VALUES``
    Variation on ``SPLIT_ALL_COMMA_SEPARATED_VALUES`` in which, if a
    subexpression with a comma fits in its starting line, then the
    subexpression is not split. This avoids splits like the one for
    ``b`` in this code:

    .. code-block:: python

      abcdef(
          aReallyLongThing: int,
          b: [Int,
              Int])

    With the new knob this is split as:

    .. code-block:: python

      abcdef(
          aReallyLongThing: int,
          b: [Int, Int])

``SPLIT_BEFORE_BITWISE_OPERATOR``
    Set to ``True`` to prefer splitting before ``&``, ``|`` or ``^`` rather
    than after.

``SPLIT_BEFORE_ARITHMETIC_OPERATOR``
    Set to ``True`` to prefer splitting before ``+``, ``-``, ``*``, ``/``, ``//``,
    or ``@`` rather than after.

``SPLIT_BEFORE_CLOSING_BRACKET``
    Split before the closing bracket if a ``list`` or ``dict`` literal doesn't
    fit on a single line.

``SPLIT_BEFORE_DICT_SET_GENERATOR``
    Split before a dictionary or set generator (comp_for). For example, note
    the split before the ``for``:

    .. code-block:: python

        foo = {
            variable: 'Hello world, have a nice day!'
            for variable in bar if variable != 42
        }

``SPLIT_BEFORE_DOT``
    Split before the ``.`` if we need to split a longer expression:

    .. code-block:: python

      foo = ('This is a really long string: {}, {}, {}, {}'.format(a, b, c, d))

    would reformat to something like:

    .. code-block:: python

      foo = ('This is a really long string: {}, {}, {}, {}'
             .format(a, b, c, d))

``SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN``
    Split after the opening paren which surrounds an expression if it doesn't
    fit on a single line.

``SPLIT_BEFORE_FIRST_ARGUMENT``
    If an argument / parameter list is going to be split, then split before the
    first argument.

``SPLIT_BEFORE_LOGICAL_OPERATOR``
    Set to ``True`` to prefer splitting before ``and`` or ``or`` rather than
    after.

``SPLIT_BEFORE_NAMED_ASSIGNS``
    Split named assignments onto individual lines.

``SPLIT_COMPLEX_COMPREHENSION``
    For list comprehensions and generator expressions with multiple clauses
    (e.g multiple ``for`` calls, ``if`` filter expressions) and which need to
    be reflowed, split each clause onto its own line. For example:

    .. code-block:: python

      result = [
          a_var + b_var for a_var in xrange(1000) for b_var in xrange(1000)
          if a_var % b_var]

    would reformat to something like:

    .. code-block:: python

      result = [
          a_var + b_var
          for a_var in xrange(1000)
          for b_var in xrange(1000)
          if a_var % b_var]

``SPLIT_PENALTY_AFTER_OPENING_BRACKET``
    The penalty for splitting right after the opening bracket.

``SPLIT_PENALTY_AFTER_UNARY_OPERATOR``
    The penalty for splitting the line after a unary operator.

``SPLIT_PENALTY_ARITHMETIC_OPERATOR``
    The penalty of splitting the line around the ``+``, ``-``, ``*``, ``/``,
    ``//``, ``%``, and ``@`` operators.

``SPLIT_PENALTY_BEFORE_IF_EXPR``
    The penalty for splitting right before an ``if`` expression.

``SPLIT_PENALTY_BITWISE_OPERATOR``
    The penalty of splitting the line around the ``&``, ``|``, and ``^``
    operators.

``SPLIT_PENALTY_COMPREHENSION``
    The penalty for splitting a list comprehension or generator expression.

``SPLIT_PENALTY_EXCESS_CHARACTER``
    The penalty for characters over the column limit.

``SPLIT_PENALTY_FOR_ADDED_LINE_SPLIT``
    The penalty incurred by adding a line split to the logical line. The more
    line splits added the higher the penalty.

``SPLIT_PENALTY_IMPORT_NAMES``
    The penalty of splitting a list of ``import as`` names. For example:

    .. code-block:: python

      from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
                                                                long_argument_2,
                                                                long_argument_3)

    would reformat to something like:

    .. code-block:: python

      from a_very_long_or_indented_module_name_yada_yad import (
          long_argument_1, long_argument_2, long_argument_3)

``SPLIT_PENALTY_LOGICAL_OPERATOR``
    The penalty of splitting the line around the ``and`` and ``or`` operators.

``USE_TABS``
    Use the Tab character for indentation.

(Potentially) Frequently Asked Questions
========================================

--------------------------------------------
Why does YAPF destroy my awesome formatting?
--------------------------------------------

YAPF tries very hard to get the formatting correct. But for some code, it won't
be as good as hand-formatting. In particular, large data literals may become
horribly disfigured under YAPF.

The reasons for this are manyfold. In short, YAPF is simply a tool to help
with development. It will format things to coincide with the style guide, but
that may not equate with readability.

What can be done to alleviate this situation is to indicate regions YAPF should
ignore when reformatting something:

.. code-block:: python

    # yapf: disable
    FOO = {
        # ... some very large, complex data literal.
    }

    BAR = [
        # ... another large data literal.
    ]
    # yapf: enable

You can also disable formatting for a single literal like this:

.. code-block:: python

    BAZ = {
        (1, 2, 3, 4),
        (5, 6, 7, 8),
        (9, 10, 11, 12),
    }  # yapf: disable

To preserve the nice dedented closing brackets, use the
``dedent_closing_brackets`` in your style. Note that in this case all
brackets, including function definitions and calls, are going to use
that style.  This provides consistency across the formatted codebase.

-------------------------------
Why Not Improve Existing Tools?
-------------------------------

We wanted to use clang-format's reformatting algorithm. It's very powerful and
designed to come up with the best formatting possible. Existing tools were
created with different goals in mind, and would require extensive modifications
to convert to using clang-format's algorithm.

-----------------------------
Can I Use YAPF In My Program?
-----------------------------

Please do! YAPF was designed to be used as a library as well as a command line
tool. This means that a tool or IDE plugin is free to use YAPF.

-----------------------------------------
I still get non Pep8 compliant code! Why?
-----------------------------------------

YAPF tries very hard to be fully PEP 8 compliant. However, it is paramount
to not risk altering the semantics of your code. Thus, YAPF tries to be as
safe as possible and does not change the token stream
(e.g., by adding parentheses).
All these cases however, can be easily fixed manually. For instance,

.. code-block:: python

    from my_package import my_function_1, my_function_2, my_function_3, my_function_4, my_function_5

    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

won't be split, but you can easily get it right by just adding parentheses:

.. code-block:: python

    from my_package import (my_function_1, my_function_2, my_function_3,
                            my_function_4, my_function_5)

    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)

Gory Details
============

----------------
Algorithm Design
----------------

The main data structure in YAPF is the ``LogicalLine`` object. It holds a list
of ``FormatToken``\s, that we would want to place on a single line if there
were no column limit. An exception being a comment in the middle of an
expression statement will force the line to be formatted on more than one line.
The formatter works on one ``LogicalLine`` object at a time.

An ``LogicalLine`` typically won't affect the formatting of lines before or
after it. There is a part of the algorithm that may join two or more
``LogicalLine``\s into one line. For instance, an if-then statement with a
short body can be placed on a single line:

.. code-block:: python

    if a == 42: continue

YAPF's formatting algorithm creates a weighted tree that acts as the solution
space for the algorithm. Each node in the tree represents the result of a
formatting decision --- i.e., whether to split or not to split before a token.
Each formatting decision has a cost associated with it. Therefore, the cost is
realized on the edge between two nodes. (In reality, the weighted tree doesn't
have separate edge objects, so the cost resides on the nodes themselves.)

For example, take the following Python code snippet. For the sake of this
example, assume that line (1) violates the column limit restriction and needs to
be reformatted.

.. code-block:: python

    def xxxxxxxxxxx(aaaaaaaaaaaa, bbbbbbbbb, cccccccc, dddddddd, eeeeee):  # 1
        pass                                                               # 2

For line (1), the algorithm will build a tree where each node (a
``FormattingDecisionState`` object) is the state of the line at that token given
the decision to split before the token or not. Note: the ``FormatDecisionState``
objects are copied by value so each node in the graph is unique and a change in
one doesn't affect other nodes.

Heuristics are used to determine the costs of splitting or not splitting.
Because a node holds the state of the tree up to a token's insertion, it can
easily determine if a splitting decision will violate one of the style
requirements. For instance, the heuristic is able to apply an extra penalty to
the edge when not splitting between the previous token and the one being added.

There are some instances where we will never want to split the line, because
doing so will always be detrimental (i.e., it will require a backslash-newline,
which is very rarely desirable). For line (1), we will never want to split the
first three tokens: ``def``, ``xxxxxxxxxxx``, and ``(``. Nor will we want to
split between the ``)`` and the ``:`` at the end. These regions are said to be
"unbreakable." This is reflected in the tree by there not being a "split"
decision (left hand branch) within the unbreakable region.

Now that we have the tree, we determine what the "best" formatting is by finding
the path through the tree with the lowest cost.

And that's it!
