Skip to main content

Python SDK for Featureflip - a feature flag SaaS platform

Project description

Featureflip Python SDK

Python SDK for Featureflip - evaluate feature flags locally with near-zero latency.

Installation

pip install featureflip

Quick Start

from featureflip import FeatureflipClient

# Initialize the client (blocks until flags are loaded)
client = FeatureflipClient(sdk_key="your-sdk-key")

# Evaluate a feature flag
enabled = client.variation("my-feature", {"user_id": "user-123"}, default=False)

if enabled:
    print("Feature is enabled!")
else:
    print("Feature is disabled")

# Clean shutdown
client.close()

Lifetime: Multiple FeatureflipClient(sdk_key="x") calls with the same SDK key return distinct handles sharing one underlying client — you cannot accidentally open duplicate streaming connections by constructing multiple clients. close() is refcounted; the real shutdown runs only when the last handle is closed.

Configuration

from featureflip import FeatureflipClient, Config

client = FeatureflipClient(
    sdk_key="your-sdk-key",
    config=Config(
        base_url="https://eval.featureflip.io",  # Evaluation API URL
        streaming=True,           # Use SSE for real-time updates (default)
        poll_interval=30.0,       # Polling interval if streaming=False
        send_events=True,         # Enable analytics event tracking
        flush_interval=30.0,      # Event flush interval in seconds
        init_timeout=10.0,        # Max seconds to wait for initialization
    )
)

The SDK key can also be set via the FEATUREFLIP_SDK_KEY environment variable.

Context Manager

with FeatureflipClient(sdk_key="your-sdk-key") as client:
    enabled = client.variation("my-feature", {"user_id": "123"}, default=False)
# Automatically closes and flushes events on exit

Evaluation

# Boolean flag
enabled = client.variation("feature-key", {"user_id": "123"}, default=False)

# String flag
tier = client.variation("pricing-tier", {"user_id": "123"}, default="free")

# Number flag
limit = client.variation("rate-limit", {"user_id": "123"}, default=100)

# JSON flag
config = client.variation("ui-config", {"user_id": "123"}, default={"theme": "light"})

Detailed Evaluation

detail = client.variation_detail("feature-key", {"user_id": "123"}, default=False)

print(detail.value)    # The evaluated value
print(detail.reason)   # "RULE_MATCH", "FALLTHROUGH", "FLAG_DISABLED", etc.
print(detail.rule_id)  # Rule ID if reason is RULE_MATCH

Event Tracking

# Track custom events
client.track("checkout-completed", {"user_id": "123"}, metadata={"total": 99.99})

# Identify users for segment building
client.identify({"user_id": "123", "email": "user@example.com", "plan": "pro"})

# Force flush pending events
client.flush()

Testing

Use the test client for deterministic unit tests:

from featureflip import FeatureflipClient

# Create a test client with fixed values (no network calls)
client = FeatureflipClient.for_testing({
    "my-feature": True,
    "pricing-tier": "pro",
})

# Evaluations return the configured values
assert client.variation("my-feature", {}, default=False) is True
assert client.variation("pricing-tier", {}, default="free") == "pro"

# Unknown flags return the default
assert client.variation("unknown", {}, default="fallback") == "fallback"

# Update values at runtime
client.set_test_value("my-feature", False)

Features

  • Client-side evaluation - Near-zero latency after initialization
  • Real-time updates - SSE streaming with polling fallback
  • Event tracking - Automatic batching and flushing of analytics events
  • Test support - for_testing() factory for deterministic unit tests
  • Type-safe - Full type hints with mypy strict mode compliance

Requirements

  • Python 3.10+

Development

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run linting
ruff check src/featureflip tests

# Run type checking
mypy src/featureflip --strict

License

MIT

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

featureflip-2.3.1.tar.gz (70.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

featureflip-2.3.1-py3-none-any.whl (41.3 kB view details)

Uploaded Python 3

File details

Details for the file featureflip-2.3.1.tar.gz.

File metadata

  • Download URL: featureflip-2.3.1.tar.gz
  • Upload date:
  • Size: 70.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for featureflip-2.3.1.tar.gz
Algorithm Hash digest
SHA256 b0d6e1b42cbe706373a10cc53640ee02f30a5d8c11a1677ebbcd2a834b27cf60
MD5 f11d70f20e994d13f1e947a9054bc6d5
BLAKE2b-256 8751f66a59e20256843d853c3c81d88175708ccb304dd9716ac60e5e8c841b73

See more details on using hashes here.

File details

Details for the file featureflip-2.3.1-py3-none-any.whl.

File metadata

  • Download URL: featureflip-2.3.1-py3-none-any.whl
  • Upload date:
  • Size: 41.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for featureflip-2.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 007ef9a71fe35c2cae03b1c77395122c9de72a0c8a030dbca90e904b17d18c3d
MD5 6d105d632420dc5abe96df7229a311cf
BLAKE2b-256 d7904227ce8208413f06597dfc0c6ee3a891159c1f7b52f664a4bca8e6915df5

See more details on using hashes here.

Supported by

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