48 lines
2.3 KiB
Plaintext
48 lines
2.3 KiB
Plaintext
---
|
|
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회**.
|
|
- 실패 로그를 사용자에게 길게 반복 붙여 넣지 말 것. 고치고 결과만 보고.
|
|
- ImportError/AttributeError 시 비슷한 심볼명 추측 재실행 금지 → Grep 1회 (`invalidate_merged_env_cache` 등).
|
|
- 상세 절대규칙: `.cursorrules` CRITICAL §4.
|