Skip to main content

Keep track of components in strings, especially formatted values in f-strings.

Project description

fvalues

Build Status Coverage Status

This is a Python library for keeping track of the combination of components in a string. In particular it lets you separate out the formatted values in an f-string. Here's an example:

from fvalues import F, FValue

x = 1.2345
f = F(f"twice x is {x * 2:.2f}")
assert f == "twice x is 2.47"
assert f.parts == ("twice x is ", FValue(source="x * 2", value=2.469, formatted="2.47"))

Key facts:

  • F is a subclass of str so it can generally be used like any other string.
  • Calls to the constructor F() are magically detected using the executing library, and f-strings within are parsed to extract their components.
  • These are saved in the attribute F.parts. Each part is either a str representing a constant section or an FValue representing a dynamic expression.
  • FValue.source contains the source code between the braces ({}) but before the colon (:) and format spec (.2f). In some cases it may not be the exact original source code, but equivalent code produced by ast.unparse.
  • FValue.value and FValue.formatted are calculated using eval(), so be careful of expressions that you wouldn't want to evaluate twice due to performance or side effects.

Usage in ICE

This library was built to enhance the Interactive Composition Explorer (ICE). In the screenshot below, the prompt under 'Inputs' on the right is an F object, and the colored text corresponds to dynamic FValues.

ICE screenshot

Concatenation

The F class also has special support for concatenation with the + operator:

f += "!"
assert f == "twice x is 2.47!"
assert f.parts == (
    FValue(
        source="f",
        value="twice x is 2.47",
        formatted="twice x is 2.47",
    ),
    "!",
)

Similar to deconstructing f-strings, you can see how the parts distinguish between the dynamic expression f on the left of +=, representing it as an FValue, and the static "!" on the right.

Flattening

In the assertion above above, FValue.value is shown as a plain string, but remember that it's actually also an F object itself. The assertion works because F is a subclass of str so they can be used interchangeably. But it still has the same parts that we saw earlier. Sometimes keeping the tree of parts in its original form can be useful, other times you may want to bring everything to the surface to make things easier. You can produce an equivalent F object with a flat list of parts using F.flatten:

assert f.flatten().parts == (
    "twice x is ",
    FValue(
        source="x * 2",
        value=2.469,
        formatted="2.47",
    ),
    "!",
)

Other string methods

Most F methods (e.g. .lower()) are directly inherited from str, which means that they return a plain str rather than another F object. So be careful with those methods if you don't want to lose information about the parts! The methods below have specialised implementations to avoid this. More may be added in the future.

strip

F.strip does the same thing as the usual str.strip as far as the whole string is concerned, but also strips the internal parts in the way you'd probably expect. See the docstring for more details. The related methods lstrip and rstrip strip the left/right sides as expected.

Make sure to write F(f"...").strip() rather than F(f"...".strip()) or the f-string magic won't work.

join

separator.join(strings) will return an F object only if separator is an F object. If separator is a plain str, then the result will be a plain str, even if strings is a list of F objects. In practice, this typically means you should write e.g. F(" ").join(strings) rather than " ".join(strings).

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

fvalues-0.0.4.tar.gz (327.2 kB view details)

Uploaded Source

Built Distribution

fvalues-0.0.4-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file fvalues-0.0.4.tar.gz.

File metadata

  • Download URL: fvalues-0.0.4.tar.gz
  • Upload date:
  • Size: 327.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.7

File hashes

Hashes for fvalues-0.0.4.tar.gz
Algorithm Hash digest
SHA256 d629d0fff4a5c47b926d94c77d385efed1947c40c5a53f686615c4edb387f56e
MD5 1c9c0bb29d8c93943e61772bde57e01a
BLAKE2b-256 06a7c9bf5d5392ecf7e0ef0d7aa92e949320f4361d8703e1d42022efa4ecccd6

See more details on using hashes here.

File details

Details for the file fvalues-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: fvalues-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 9.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.7

File hashes

Hashes for fvalues-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 9ed462e2b305004b145d95e8d57e81a744f70978a226c5916f488ac6e51609e6
MD5 c9fb0c3abbe74e8a8555a5e4a7f1fdc0
BLAKE2b-256 f04db545ecb90ad851ea6bc913b116cf247a7736fe910cb85e61abe8a3aa85f7

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