====
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/workflows/ci.yml
    :alt: Build status

.. image:: https://github.com/google/yapf/actions/workflows/pre-commit.yml/badge.svg
    :target: https://github.com/google/yapf/actions/workflows/pre-commit.yml
    :alt: Run pre-commit

.. 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!
