
Python Development
- 132 installs
- 381 repo stars
- Updated August 4, 2026
- community-access/accessibility-agents
Authoring Python services, scripts, and agent tooling that automate accessibility audits, parse reports, and integrate remediation workflows into CI or review bots.
About
Covers Python development within the accessibility-agents ecosystem: building scanners, parsers, scoring helpers, and integration scripts that agents invoke to detect issues, rank severity, and propose concrete WCAG fixes in automated pipelines.
- Python agents for a11y automation
- Report parsing and remediation hooks
- CI-friendly scripting patterns
- API integration for audit tools
- Extends accessibility-agents repo workflows
Python Development by the numbers
- 132 all-time installs (skills.sh)
- Ranked #88 of 290 Python skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/community-access/accessibility-agents --skill python-developmentAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 132 |
|---|---|
| repo stars | ★ 381 |
| Last updated | August 4, 2026 |
| Repository | community-access/accessibility-agents ↗ |
What it does
Authoring Python services, scripts, and agent tooling that automate accessibility audits, parse reports, and integrate remediation workflows into CI or review bots.
Files
<!-- CANONICAL SOURCE: .github/skills/python-development/SKILL.md -- Edit the canonical source; sync to Gemini via scripts/check-gemini-sync.ps1 -->
Python Development Skill
Reference data for the Developer Hub, Python Specialist, and wxPython Specialist agents.
Python Version Quick Reference
| Version | Key Features | EOL |
|---|---|---|
| 3.10 | match/case, `X \ | Y unions, ParamSpec` |
| 3.11 | Exception groups, Self type, tomllib, faster CPython | Oct 2027 |
| 3.12 | Type parameter syntax def f[T](), @override, f-string nesting | Oct 2028 |
| 3.13 | Experimental free-threaded mode, improved error messages | Oct 2029 |
| 3.14 | async pdb.set_trace_async(), template strings (PEP 750) | Oct 2030 |
pyproject.toml Skeleton
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "my-app"
version = "1.0.0"
requires-python = ">=3.10"
dependencies = []
[project.optional-dependencies]
dev = ["pytest>=8.0", "ruff>=0.6", "mypy>=1.11"]
[project.scripts]
myapp = "my_app.__main__:main"
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-ra --strict-markers"
[tool.ruff]
target-version = "py310"
line-length = 100
[tool.ruff.lint]
select = ["E", "F", "W", "I", "N", "UP", "B", "SIM", "TCH"]
[tool.mypy]
python_version = "3.10"
strict = truePyInstaller Quick Reference
One-File Mode
exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas,
name='MyApp', console=False, icon='icon.ico')One-Folder Mode
exe = EXE(pyz, a.scripts, exclude_binaries=True,
name='MyApp', console=False, icon='icon.ico')
coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, name='MyApp')Common Hidden Imports
pkg_resources.externaccessible_output2(for a11y desktop apps)keyring.backends(for credential storage)platformdirshttpx._transports/httpcore._backendsencodings(always needed)
wxPython Quick Reference
Sizer Cheat Sheet
| Sizer | When to Use |
|---|---|
wx.BoxSizer(wx.VERTICAL) | Stack items top-to-bottom |
wx.BoxSizer(wx.HORIZONTAL) | Lay items left-to-right |
wx.GridBagSizer(vgap, hgap) | Form layouts with labels + controls |
wx.FlexGridSizer(rows, cols, vgap, hgap) | Even grid layouts |
wx.WrapSizer | Flow layout that wraps |
wx.StaticBoxSizer(wx.VERTICAL, parent, "Label") | Grouped controls with border |
Thread-Safe GUI Updates
# From worker thread:
wx.CallAfter(self.update_status, "Done")
wx.PostEvent(self, CustomEvent(data=result))
# NEVER do this from a worker thread:
self.status_bar.SetStatusText("Done") # CRASH or CORRUPTIONStandard IDs
| ID | Purpose |
|---|---|
wx.ID_OK | OK button |
wx.ID_CANCEL | Cancel button |
wx.ID_SAVE | Save action |
wx.ID_OPEN | Open action |
wx.ID_EXIT | Exit / Quit |
wx.ID_HELP | Help action |
wx.ID_NEW | New document |
wx.ID_UNDO / wx.ID_REDO | Undo / Redo |
Event Types
| Event | Trigger |
|---|---|
wx.EVT_BUTTON | Button click |
wx.EVT_MENU | Menu item selected |
wx.EVT_CLOSE | Window close requested |
wx.EVT_SIZE | Window resized |
wx.EVT_TIMER | Timer fired |
wx.EVT_TEXT | Text control content changed |
wx.EVT_LIST_ITEM_SELECTED | List item selected |
wx.EVT_TREE_SEL_CHANGED | Tree selection changed |
wx.EVT_UPDATE_UI | UI state update check |
Common Pitfalls
Python
- Mutable default arguments:
def f(items=[])shares the list across calls. UseNoneand create inside. - Late binding closures:
lambda: xin a loop captures the variable, not the value. Uselambda x=x: x. - Circular imports: Move imports inside functions, use
TYPE_CHECKINGblock, or restructure modules. - `field()` outside dataclass:
field()is only valid inside@dataclassclasses. Use plain type annotations elsewhere. - `is` vs `==`:
ischecks identity,==checks equality. Useisonly forNone,True,False. - String concatenation in loops: Use
"".join()orio.StringIOinstead.
wxPython
- GUI from worker thread: Always use
wx.CallAfter()orwx.PostEvent(). - Missing `event.Skip()`: Other handlers won't fire. Call
event.Skip()unless you intentionally consume the event. - Timer not stopped: Stop timers in
EVT_CLOSEhandler to prevent callbacks after destruction. - AUI not uninitialized: Call
_mgr.UnInit()in close handler. - Dialog not destroyed: Use context managers (
with MyDialog(...) as dlg:) for automatic cleanup. - Wrong parent for sizer items: All controls in a sizer must have the same parent panel.
- Absolute positioning: Never use
SetPosition()orSetSize()for layout. Always use sizers.
Cross-Platform Paths
from platformdirs import user_config_dir, user_data_dir, user_cache_dir
config = user_config_dir("MyApp", "MyCompany") # %APPDATA% / ~/Library/... / ~/.config/
data = user_data_dir("MyApp", "MyCompany")
cache = user_cache_dir("MyApp", "MyCompany")Testing Quick Reference
# Run all tests
pytest
# Run specific test file
pytest tests/test_queue.py
# Run specific test
pytest tests/test_queue.py::test_submit_job -v
# With coverage
pytest --cov=mypackage --cov-report=term-missing
# Stop on first failure
pytest -x
# Show locals on failure
pytest -lLogging Setup Template
import logging
def setup_logging(level: int = logging.INFO) -> None:
logging.basicConfig(
level=level,
format="%(asctime)s %(name)s %(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
# Quiet noisy libraries
logging.getLogger("httpx").setLevel(logging.WARNING)
logging.getLogger("httpcore").setLevel(logging.WARNING)Desktop Accessibility Quick Reference
Platform API Summary
| Platform | API | Python Binding |
|---|---|---|
| Windows | UI Automation | comtypes + UIAutomationCore |
| Windows | MSAA/IAccessible2 | pyia2, comtypes |
| macOS | NSAccessibility | pyobjc-framework-Cocoa |
wxPython Accessibility
# Set accessible name (screen reader label)
control.SetLabel("Descriptive Label")
# Set accessible description (supplementary info)
# Use wx.AccessibleDescription or wx.Accessible subclass
# Keyboard navigation
control.SetFocus() # Move focus programmatically
panel.SetFocusIgnoringChildren() # Focus the panel itself