Fiddle: A Python-first configuration library
Fiddle is a Python-first configuration library designed particularly for machine learning applications. It enables deep configurability of parameters in a program, allowing configurations to be expressed in readable and maintainable Python code. It aims to reduce boilerplate and provides good error messages. The library is currently at version 0.3.0 and is actively developed by Google.
Warnings
- breaking Fiddle is currently in 'Development Status :: 3 - Alpha'. This means the API is not yet stable, and breaking changes may occur in future releases.
- gotcha Using mutable default arguments (e.g., lists, dictionaries) in functions configured by Fiddle can lead to unexpected shared state across different configurations or calls. Python evaluates default arguments once when the function is defined.
- gotcha `fdl.Config` and `fdl.Partial` behave differently when `fdl.build()` is called. `fdl.Config` directly invokes the callable and returns its result, while `fdl.Partial` returns a `functools.partial` object that needs to be called separately to get the final result.
Install
-
pip install fiddle -
pip install fiddle[flags]
Imports
- fiddle
import fiddle as fdl
- Config
from fiddle import Config
Quickstart
import fiddle as fdl
def create_greeting(prefix: str, name: str = "World", punctuation: str = "!"):
return f"{prefix} {name}{punctuation}"
# Create a Fiddle configuration for the function
cfg = fdl.Config(create_greeting, prefix="Hello", name="Fiddle")
# Build the configured function to get the result
result = fdl.build(cfg)
print(f"Original Fiddle build: {result}")
# Modify the configuration
cfg.punctuation = "!!"
result_modified = fdl.build(cfg)
print(f"Modified Fiddle build: {result_modified}")
# Demonstrate fdl.Partial, which returns a functools.partial object
partial_cfg = fdl.Partial(create_greeting, prefix="Hi")
partial_func = fdl.build(partial_cfg) # This returns a functools.partial object
result_partial = partial_func(name="Python") # Call the partial function
print(f"Partial Fiddle build: {result_partial}")