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