---
description: 에이전트 셸·Python 원라이너 — 문법 오류 코드 금지로 토큰/재실행 낭비 방지
alwaysApply: true
---

# 에이전트 셸 / Python 스니펫 안전 (토큰 절약)

대화에서 실제로 낭비된 패턴: **실행 전에 문법이 틀린 Python을 heredoc으로 돌림**  
(예: `from X import Y if False else None` → `SyntaxError` → 재작성으로 턴·토큰 낭비).

## 1. 실행 전 문법 유효성 (필수)

- `python - <<'PY'` / `-c` / 임시 `.py` 를 **돌리기 전에** 문법이 맞는지 스스로 확인.
- 확신이 없으면 파일로 쓴 뒤 `python -m py_compile path.py` **1회**만 하고 실행.
- `SyntaxError` / `IndentationError` 나면 **원인 고친 뒤 1회만** 재실행. 같은 스니펫을 살짝만 바꿔 반복 금지.

## 2. 금지 패턴 (자주 나는 가짜 문법)

- `from module import name if cond else None` — **문법 불가**.  
  → `import module as m` 후 `getattr(m, "name", None)` 또는 `try/except ImportError`.
- `from X import a, b if c` / 조건부 import를 `from` 한 줄에 섞기.
- 존재하지 않는 심볼을 **추측 import** (`get_scalp_grids` 등).  
  → 먼저 `hasattr` / `dir` / Grep으로 실명 확인 후 import.
- heredoc 안에서 이전에 실패한 코드를 **거의 그대로** 다시 붙여 넣기.

## 3. 그리드·헬퍼 조회 스니펫 최소형

축 개수 세기 등은 아래처럼 **검증된 형태만** 사용 (조건부 from 금지):

```python
from kis_trader.backtest.param_search_breakout import _breakout_grids
import kis_trader.backtest.param_search_scalping as sc

bg = _breakout_grids()
print({m: len(a) for m, a in bg.items()})
fn = getattr(sc, "_scalp_grids", None)
print({m: len(a) for m, a in fn().items()} if callable(fn) else "no _scalp_grids")
```

시그니처를 모르면 `inspect.signature(fn)` **먼저** — `_tail_grids(mode)` 처럼 인자가 필요한데 `()`로 호출하지 말 것.

## 4. 토큰 절약 원칙

- “한 번에 여러 전략 import + 조건부 트릭”보다 **짧은 확정 코드 1회**.
- 실패 로그를 사용자에게 길게 반복 붙여 넣지 말 것. 고치고 결과만 보고.
