# Immunize Python None Attribute Access

> Use when writing Python that calls a function returning an Optional value (e.g., dict.get, re.search) before accessing attributes on the result.

- **Type:** Skill
- **Install:** `agentstack add skill-viditkbhatnagar-immunize-python-none-attribute-access`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [viditkbhatnagar](https://agentstack.voostack.com/s/viditkbhatnagar)
- **Installs:** 0
- **Category:** [AI & ML](https://agentstack.voostack.com/c/ai-and-ml)
- **Latest version:** 0.1.0
- **License:** Apache-2.0
- **Upstream author:** [viditkbhatnagar](https://github.com/viditkbhatnagar)
- **Source:** https://github.com/viditkbhatnagar/immunize/tree/main/src/immunize/patterns/python-none-attribute-access
- **Website:** https://pypi.org/project/immunize/

## Install

```sh
agentstack add skill-viditkbhatnagar-immunize-python-none-attribute-access
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# python-none-attribute-access

Before dereferencing an Optional, check for None. `dict.get(key)` returns
`None` when the key is missing; `re.search(...)` returns `None` on no
match; many ORMs return `None` for "not found." Accessing any attribute
on that `None` raises:

    AttributeError: 'NoneType' object has no attribute '...'

Type checkers flag this, but runtime code often slips through — the
AttributeError only surfaces on the unlucky input.

## Example

Wrong — crashes when `user_id` is not in the registry:

```python
def lookup_display_name(registry: dict[str, User], user_id: str) -> str:
    user = registry.get(user_id)
    return user.name
```

Right — handle the None case explicitly:

```python
def lookup_display_name(registry: dict[str, User], user_id: str) -> str:
    user = registry.get(user_id)
    if user is None:
        return "unknown"
    return user.name
```

## Don't catch AttributeError

Wrapping the access in `try: ... except AttributeError:` hides real
bugs — a typo in an attribute name becomes silent. The correct fix is
an explicit None check, a sentinel default, or failing fast with a
clearer error.

## Sentinel alternatives

- `dict.get(key, default)` — pass a fallback directly.
- `if key not in registry:` — fail fast with a specific error message.
- `registry.setdefault(key, default_user)` — ensure the slot exists.

Pick the option whose semantics match what the caller expects to see
when the value is missing.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [viditkbhatnagar](https://github.com/viditkbhatnagar)
- **Source:** [viditkbhatnagar/immunize](https://github.com/viditkbhatnagar/immunize)
- **License:** Apache-2.0
- **Homepage:** https://pypi.org/project/immunize/

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-viditkbhatnagar-immunize-python-none-attribute-access
- Seller: https://agentstack.voostack.com/s/viditkbhatnagar
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
