Skip to main content

Python String Formatting Style (SFS) plugin for flake8

Project description

flake8-sfs - Python String Formatting Style Plugin

Released on the Python Package Index (PyPI) Released on Conda pre-commit.ci status GitHub workflow status PyPI downloads Code style: black

Introduction

This is an MIT licensed flake8 plugin for enforcing a Python string formatting preference. It is available to install from the Python Package Index (PyPI).

For historical reasons, the Python programming language has accumulated multiple ways to do string formatting. The three main ones are:

  • Percent operator (violation codes SFS1##), as in this example:

>>> name = "Peter"
>>> price = 1.2
>>> print("Hello %s, do you have $%0.2f?" % (name, price))
Hello Peter, do you have $1.20?
  • Format method (violation codes SFS2##), available since Python 2.6,

>>> name = "Peter"
>>> price = 1.2
>>> print("Hello {}, do you have ${:0.2f}?".format(name, price))
Hello Peter, do you have $1.20?
  • f-strings (violation codes SFS3##), available since Python 3.6,

>>> name = "Peter"
>>> price = 1.2
>>> print(f"Hello {name}, do you have ${price:0.2f}?")

We are spoilt for choice, but quoting the Zen of Python, There should be one - and preferably only one - obvious way to do it. This flake8 plugin exists to let you define which of these styles your project allows.

By default this plugin complains about all three styles - we expect you to make an explicit choice and configure which codes to ignore. See uses cases below.

Flake8 Validation codes

Early versions of flake8 assumed a single character prefix for the validation codes, which became problematic with collisions in the plugin ecosystem. Since v3.0, flake8 has supported longer prefixes therefore this plugin uses SFS as its prefix (short for String Format Style).

Prefix SFS1 - percent operator:

Code

Description

SFS101

String literal formatting using percent operator.

SFS102

Bytes literal formatting using percent operator.

Prefix SFS2 - format method:

Code

Description

SFS201

String literal formatting using .format method.

SFS202

String formatting with str.format(’…’, …) directly.

Prefix SFS3 - f-strings:

Code

Description

SFS301

String literal formatting using f-string.

You can use a partial code like SFS1 in flake8 to ignore all the SFS1## percent formatting codes.

Use cases

If you accept that f-strings are best, you could run a tool like flynt to automatically convert all your code - and then use this flake8 plugin to enforce the style by configuring it to ignore the SFS301 violation.

You might be maintaining a project which still supports Python 2, where you have a mix of percent and format method string formatting. Here tell flake8 to ignore the SFS1 and SFS2 prefixes, and complain only about f-strings which would be a syntax error on Python 2 (i.e. enforce only prefix SFS3).

Alternatively, you might have a large legacy codebase with lots of the percent formatting - yet want to move any format methods to f-strings. Here you could ignore the SFS1 and SFS3 prefixes and enforce only the format method checks (SFS2 prefix).

Or you might say the old ways are the best, and configure flake8 to ignore the percent formatting but treat either the format method or f-strings as errors (by ignoring the SFS1 prefix).

Installation and usage

Python 3.7 or later is required.

We recommend installing the plugin using pip, which handles the dependencies:

$ pip install flake8-sfs

Developers may install the plugin from the git repository with optional dependencies:

$ pip install -e .[develop]

Alternatively, if you are using the Anaconda packaging system, the following command will install the plugin with its dependencies:

$ conda install -c conda-forge flake8-sfs

The new validator should be automatically included when using flake8 which may now report additional validation codes starting with SFS (as defined above). For example:

$ flake8 example.py

You can request only the SFS codes be shown using:

$ flake8 --select SFS example.py

You should add at least some SFS validation codes to your flake8 configuration file’s select or ignore list.

Configuration

We assume you are familiar with flake8 configuration.

Unless your code performs no string formatting at all (which would be unusual), you should tell flake8 to ignore at least one of this plugin’s violation codes. For example:

[flake8]
extend-ignore =
    # Ignore f-strings, we like them:
    SFS301,

Note that flake8 allows splitting comma separated lists over multiple lines, and allows including of hash comment lines.

Version History

Version

Released

Changes

v0.0.4

2022-11-01

  • Requires at least Python 3.7.

  • Replaces setup.py with pyproject.toml (contribution from Sergey B Kirpichev).

v0.0.3

2020-01-22

  • Updates to documentation and PyPI metadata.

v0.0.2

2020-01-12

  • Codes now have a hierarchy (so can ignore whole groups).

  • Added str.format("...", ...) check.

v0.0.1

2020-01-11

  • Initial public release (initial codes later reallocated).

Developers

This plugin is on GitHub at https://github.com/peterjc/flake8-sfs

To make a new release once tested locally and online:

$ git tag vX.Y.Z
$ python -m build
$ twine upload dist/flake8?sfs-X.Y.Z*
$ git push origin master --tags

The PyPI upload should trigger an automated pull request updating the flake8-sfs conda-forge recipe.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flake8-sfs-0.0.4.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

flake8_sfs-0.0.4-py2.py3-none-any.whl (6.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file flake8-sfs-0.0.4.tar.gz.

File metadata

  • Download URL: flake8-sfs-0.0.4.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for flake8-sfs-0.0.4.tar.gz
Algorithm Hash digest
SHA256 81414c8041531e173f3285f2c0552b8e25aaf3b973e17ea33c3b0719385c93b8
MD5 64b3d2853e5fb7403e7edcced15a3e28
BLAKE2b-256 1f4e983238696fe1d373c1958af69eca15774cad7a8bec21bbccb81f1167ece3

See more details on using hashes here.

File details

Details for the file flake8_sfs-0.0.4-py2.py3-none-any.whl.

File metadata

  • Download URL: flake8_sfs-0.0.4-py2.py3-none-any.whl
  • Upload date:
  • Size: 6.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for flake8_sfs-0.0.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 0e10a363184aee3280643b76d4ae2109a7de7b51d8e3018a673138e8a9d2bc4e
MD5 3df212b196083a85290a1f52baa8c7fa
BLAKE2b-256 51ac4b6791c9fc12a155529de2106ad16d49baa0319dc61f593f3b0f4e0b616c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page