Skip to content

Latest commit

 

History

History
41 lines (27 loc) · 2.14 KB

CLAUDE.md

File metadata and controls

41 lines (27 loc) · 2.14 KB

Alignment instructions to contribute to this repository

Hard rules

  • Make sure mypy --strict passes for these two folders uv run mypy --strict src/wcgw src/wcgw_cli.
  • Use list directly for typing like list[str] no need to import List. Same thing for tuple, set, etc.
  • No optional parameters in a function with default values. All parameters must be passed by a caller.
  • This library uses uv as package manager. To add a package uv add numpy. To run pytest uv run pytest and so on.

Coding mantras

Reduce states and dependencies between the states

  • Don't introduce any state unless really necessary.
  • If anything can be derived, avoid storing it or passing it.

Python Exception guideline 1

  • Exception thrown inside functions are their hidden extra state which should be avoided.
  • Parse don't validate: avoid throwing validation errors by letting the types avoid bad values to be passed in the first place.

Put burden on type checker not the code reader

  • No hidden contracts and assumptions.
  • Don't assume any relationship between two states unless it's encoded in the type of the state.
  • Any contract should be enforced by the way types are constructed.
  • If it's just not possible due to complexity to type in such a way to avoid hidden contract, add in docstring details.

Python Exception guideline 2

  • When you can't avoid it, instead of enforcing the hidden contract as hard failure during runtime, try to return some sensible value instead. Example In PIL adding boxes outside image bounds don't do anything, but they don't fail either, making it a cleaner experience to deal with edge cases.

  • A functions signature (along with types) should be enough to understand its purpose.

  • This can be achieved by typing the parameters to only take narrow types

Functions should be as pure as possible

  • Avoid mutating mutable input parameters, instead return newly derived values in the output and leave upto the caller to update the state if required.
  • It should be clear from function signature what the function computes, this should also enforce the previous point of not updating mutable input parameters.