Welcome to func_args Documentation
Overview
func_args is a lightweight, zero-dependency Python library that provides sentinel values (REQ and OPT) for enhanced function argument handling. It solves common problems when creating wrapper functions around third-party APIs.
Key features:
REQ sentinel — marks parameters as required, with early validation
OPT sentinel — marks parameters as optional, automatically excluded from kwargs
prepare_kwargs() — validates required and removes optional in one pass
BaseModel / BaseFrozenModel — dataclass mixins that bypass the “default after non-default” ordering limitation
Install
$ pip install func-args
Usage
1. Wrapping Third-Party APIs
The most common use case: creating a better interface around an existing API.
from func_args.api import REQ, OPT, prepare_kwargs
# Suppose this is a third-party API you cannot modify:
def put_object(Bucket, Key, Body, Metadata=None, Tags=None):
"""AWS S3 put_object simplified."""
...
# Your enhanced wrapper:
def better_put_object(
Bucket: str = REQ,
Key: str = REQ,
Body: bytes = REQ,
Metadata: dict | None = OPT,
Tags: dict | None = OPT,
):
# You can add custom logic for optional params
if Metadata is OPT:
Metadata = {"creator": "admin"}
kwargs = dict(
Bucket=Bucket,
Key=Key,
Body=Body,
Metadata=Metadata,
Tags=Tags,
)
# prepare_kwargs will:
# 1. Raise ParamError if any value is still REQ (caller forgot it)
# 2. Remove any value that is still OPT (caller didn't provide it)
# 3. Return a clean dict ready for the real API call
return put_object(**prepare_kwargs(**kwargs))
# Works - Tags is OPT so it gets removed automatically
better_put_object(Bucket="my-bucket", Key="file.txt", Body=b"hello")
# Raises ParamError: "Missing required argument: 'Body'"
better_put_object(Bucket="my-bucket", Key="file.txt")
2. Individual Utilities
You can also use check_required and remove_optional separately:
from func_args.api import REQ, OPT, check_required, remove_optional
def create_user(username=REQ, email=REQ, nickname=OPT, role="user"):
# Step 1: validate required params
check_required(username=username, email=email)
# Step 2: build kwargs and remove OPT values
kwargs = remove_optional(
username=username,
email=email,
nickname=nickname,
role=role,
)
return kwargs
create_user(username="alice", email="alice@example.com")
# -> {"username": "alice", "email": "alice@example.com", "role": "user"}
create_user(username="bob", email="bob@example.com", nickname="Bobby")
# -> {"username": "bob", "email": "bob@example.com", "nickname": "Bobby", "role": "user"}
3. Enhanced Dataclasses
BaseModel and BaseFrozenModel let you define dataclasses with REQ/OPT defaults in any order — no more “fields without defaults must come before fields with defaults” restriction.
import dataclasses
from func_args.api import BaseModel, BaseFrozenModel, REQ, OPT
@dataclasses.dataclass
class DeployConfig(BaseModel):
"""
Note: OPT fields can appear BEFORE REQ fields.
Standard dataclasses would reject this ordering.
"""
region: str = dataclasses.field(default=OPT) # optional, listed first
env: str = dataclasses.field(default="prod") # has default
app_name: str = dataclasses.field(default=REQ) # required, listed last
tags: list = dataclasses.field(default_factory=list)
# REQ fields must be provided, OPT fields are truly optional
config = DeployConfig(app_name="my-service")
assert config.app_name == "my-service"
assert config.region is OPT
assert config.env == "prod"
# to_dict() returns all fields including sentinel values
config.to_dict()
# {"region": OPT, "env": "prod", "app_name": "my-service", "tags": []}
# to_kwargs() returns only provided values (OPT filtered out)
config.to_kwargs()
# {"env": "prod", "app_name": "my-service", "tags": []}
# Missing required field raises ParamError immediately
DeployConfig() # raises ParamError: "Field 'app_name' is required ..."
4. Frozen Dataclass with Computed Fields
@dataclasses.dataclass(frozen=True)
class Document(BaseFrozenModel):
title: str = dataclasses.field(default=REQ)
author: str = dataclasses.field(default=OPT)
version: int = dataclasses.field(default=1)
# Computed fields (init=False) work seamlessly
slug: str = dataclasses.field(init=False)
def __post_init__(self):
super().__post_init__() # validates REQ fields first
object.__setattr__(self, "slug", self.title.lower().replace(" ", "-"))
doc = Document(title="API Guide")
assert doc.slug == "api-guide"
assert doc.to_kwargs() == {"title": "API Guide", "version": 1, "slug": "api-guide"}
# "author" excluded because it's still OPT
API Reference
Symbol |
Description |
|---|---|
REQ |
Sentinel marking a required parameter |
OPT |
Sentinel marking an optional parameter |
check_required(**kw) |
Raises ParamError if any value is REQ |
remove_optional(**kw) |
Returns new dict with OPT values removed |
prepare_kwargs(**kw) |
Combines check_required + remove_optional in one pass |
BaseModel |
Mutable dataclass mixin with REQ/OPT support |
BaseFrozenModel |
Frozen (immutable) dataclass mixin with REQ/OPT support |
ParamError |
Exception raised for missing required parameters |
AI Agent Skill
This project ships a self-contained Agent skill at .claude/skills/func-args/SKILL.md. Copy this file into your project’s .claude/skills/ directory and your AI coding agent will know how to use func_args correctly — including API usage patterns, dataclass examples, and common pitfalls.
Metadata
Release files for func_args 1.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| func_args-1.0.2.tar.gz | 20.0 kB | Without provenance | Details for func_args-1.0.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| func_args-1.0.2-py3-none-any.whl | Python 3 | none | any | Details for func_args-1.0.2-py3-none-any.whl |
Total release size: 35.0 kB
Release files / func_args-1.0.2.tar.gz
| Download URL | func_args-1.0.2.tar.gz |
|---|---|
| Size | 20.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f46acb57f22fc0e95e6ac18c992e128f0bc207450f9cab9c02237296e0105d34
|
|
BLAKE2b-256 checksum How to use checksums |
9b20b6b297a845884b7f4ec3dd1f40a0b96280310efd3231b25374fbaf4fdef2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / func_args-1.0.2-py3-none-any.whl
| Download URL | func_args-1.0.2-py3-none-any.whl |
|---|---|
| Size | 15.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f0f36b2aea676321f436d708c39b61c4f83ddeaa31c9aef38a71898ea5fc7adb
|
|
BLAKE2b-256 checksum How to use checksums |
cb9c49269f73c85a1f934db66bda4badb5ff6aa7de2747605469f6ffa226e497
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for func_args 1.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.