Skip to main content

PyPI Downloads PyPI GitHub last commit License Python Tests

Dottify

Dottify is a lightweight Python library that converts dictionaries into objects with attribute-style access. Instead of the usual dict["key"] syntax, you can access dictionary values using dot notation like dict.key. All access is case-sensitive, but helpful suggestions are provided when a key is missing.

Installation

Install via pip:

pip install dottify

Usage

Here’s an example of how Dottify works:

from dottify import Dottify

# Initial data
persons = {
    "Alice": {
        "age": 30,
        "city": "Paris",
        "profession": "Engineer"
    },
    "Charlie": {
        "age": 35,
        "city": "Marseille",
        "profession": "Doctor"
    }
}

# Wrap with Dottify
people = Dottify(persons)

# Merge with + operator (__add__)
new_person = {
    "Bob": {
        "age": 2,
        "city": "Lyon",
        "profession": "Designer"
    }
}
people = people + new_person

# In-place merge with += (__iadd__)
people += Dottify({
    "John": {
        "age": 27,
        "city": "Toulouse",
        "profession": "Carpenter"
    }
})

# Access by dot notation and key lookup
print(people.Alice.age)             # 30
print(people["Charlie"].city)       # Marseille
print(people.Bob.profession)        # Designer

# Index-based access (__getitem__)
print(people[3].profession)         # Carpenter (John)

# Modify attributes
people.John.profession = "Developer"
people.Bob.age = 39

# Use get() with case-insensitive fallback
print(people.get("alice", "Not Found").city)     # Paris
print(people.get("ALICIA", "Not Found"))         # Not Found

# Remove a key by name
people.remove("Bob")  # Removes Bob

# Check if a key exists
print(people.has_key("charlie"))     # False (because 'charlie' != 'Charlie')
print(people.has_key("Charlie"))     # True
print(people.has_key("unknown"))     # False

# Use len(), keys(), values(), items()
print(len(people))                   # 3 (Alice, Charlie, John)
print(list(people.keys()))           # ['Alice', 'Charlie', 'John']
print([v.city for v in people.values()])  # ['Paris', 'Marseille', 'Toulouse']
print([(k, v.age) for k, v in people.items()])  # [('Alice', 30), ('Charlie', 35), ('John', 27)]

Features

  • Converts standard and nested dictionaries into objects with attribute access.
  • Supports both dot notation (obj.key) and dictionary-style (obj["key"]) access.
  • All access is case-sensitive.
  • Friendly error messages with key suggestions (case-insensitive search).
  • Key removal with .remove("Key") is case-sensitive, but also provides suggestions if the key doesn't match.
  • Easily convert back to a standard dict using .to_dict().
  • Supports .keys(), .values(), .items(), iteration, and len() additions.
  • Well-documented and fully tested with pytest.

Tests

To run the test suite:

pytest tests/

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests on the GitHub repository.

License

Distributed under the MIT License. See LICENSE for more information.

Metadata

Release files for dottify 1.1.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dottify 1.1.6
File Size Uploaded
dottify-1.1.6.tar.gz 6.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dottify 1.1.6
File Interpreter ABI Platform
dottify-1.1.6-py3-none-any.whl Python 3 none any Details

Total release size: 13.4 kB

Release files / dottify-1.1.6.tar.gz

Download URL dottify-1.1.6.tar.gz
Size 6.7 kB
Tags Source
SHA-256 checksum
How to use checksums
8b7b914411b5f3b5d26e5a3665e5f4635907ab248285d60b60994a57550f6b62
BLAKE2b-256 checksum
How to use checksums
dbf74973d5c5c7f4a80e928505f787da5c9ad197ff6a2c200bd9f8e745da59cc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / dottify-1.1.6-py3-none-any.whl

Download URL dottify-1.1.6-py3-none-any.whl
Size 6.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
06cfb6033de4c73ae40485f67b4240c945da877886b7740d3371de746ded7f13
BLAKE2b-256 checksum
How to use checksums
c8af2268fe70a4810a756261d1173e0b1be486f4f41d65a32e1953b1acd8b303
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release history Release notifications | RSS feed

2.0.0

2 release files

This release

1.1.6 This release

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.3

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page