ãã®èšäºã¯Nuco Advent Calendar 2022ã®24æ¥ç®ã®èšäºã§ã
ã¯ããã«
2022å¹Žææ°ã®Pythonéçºç°å¢ã»ãããžã§ã¯ãæ§é ã«ã€ããŠã®ç޹ä»èšäºã§ãã
çŸåšã®ããã¡ã¯ãã¹ã¿ã³ããŒããšèšããããŒã«çŸ€ãšããã®ç°¡åãªäœ¿ãæ¹ç޹ä»ããŠãããŸãã®ã§ãããããPythonã§äœããäœããã人ã¯ããã²åèã«ããŠãããããšå¬ããã§ãã
ããã§ããããã¡ã¯ãã¹ã¿ã³ããŒãã¯ããå
¬åŒã«èªããããŠãããã©ããã«é¢ããããäºå®äžã®æšæºãšããŠèªç¥ãããŠãããã®ããšããæå³åãã§çšããŠããŸãã
æãå€ãå©çšãããŠããã ãã§ãªããä»åŸãããªã£ãŠãããšèãããããæé·ãååã«æåŸ
ã§ããããŒã«çŸ€ãéžæããŠããŸãã
Pythonãããžã§ã¯ãéçºããŒã« ããã¡ã¯ãã¹ã¿ã³ããŒãã»ãã
| æ±ããæ©èœ | ã¹ã¿ã³ããŒãããŒã« |
|---|---|
| ãšãã£ã¿ | Visual Studio Code |
| ããŒãžã§ã³ç®¡ç | pyenv |
| ããã±ãŒãžç®¡ç ä»®æ³ç°å¢ç®¡ç |
Poetry |
| Linter | flake8 |
| Formatter | Black |
| åäœãã¹ã | pytest |
| åå®çŸ© | typing |
| åè§£æ | mypy |
| ãã¹ãã»è§£æç®¡ç | Nox |
| ãã¹ãèªåå | pre-commit |
åæ©èœãšããŒã«ã«ã€ããŠã説æããŠãããŸãã
ãšãã£ã¿
Visual Studio Code
ãšãã£ã¿ãIDE(çµ±åéçºç°å¢)ã¯å¥œãã«éžãã§ããã ããã°è¯ããšã¯æããŸãããç¹ã«åžæããªããªãã°ãVisual Studio Codeãéžãã§ããã°ééããªãã§ãããã
Pythonãå«ãå¹
åºãèšèªã«å¯Ÿå¿ããè±å¯ãªæ¡åŒµæ©èœãåããŠããéåžžã«ãªãããªãšãã£ã¿ã§ãããšãããPythonãããžã§ã¯ãã«ã€ããŠã¯ãããããæãã°ãç¹ã«IDEãªã©ã¯å¿
èŠãªããšæããŸãã
ã€ã³ã¹ããŒã«ã¯âããã
ããŒãžã§ã³ç®¡çãœãã
Python3ç³»ã¯æ¥å€ã¢ããããŒããããŠããŠã2022幎12æçŸåšã®ææ°verã¯ã3.11.1ãæäŸãããŠããŸãã
ãšã¯ããããããžã§ã¯ãã«ãã£ãŠã¯ã3.7.1ãŸã§ããåäœãæ
ä¿ãããŠããªããã®ã3.9.0ã§çŸåšéçºäžã®ãã®...ãªã©ããããŸããææ°ã®Pythonãåžžã«å¿
èŠããšããããã§ã¯æ±ºããŠãªããéå»ã®ããŒãžã§ã³ã®Pythonãèªç±ã«äœ¿ãåããããæ¹ããå©äŸ¿æ§ã¯é«ãã§ãã
ããã§å¿ èŠã«ãªã£ãŠããã®ããå©çšãããããŒãžã§ã³ããšã«Pythonã€ã³ã¿ããªã¿ãèªç±ã«åãæ¿ããããšã®ã§ããããŒãžã§ã³ç®¡çãœããã§ãã
pyenv
æãæåãªPythonã®ããŒãžã§ã³ç®¡çãœããã§ãã
pyenvã䜿ããšãäžã€ã®ãã·ã³äžã§ãè€æ°ã®ããŒãžã§ã³ã®Pythonã䜿ãåããããšãã§ããŸãã
pyenvãçµãªããŠãçŽæ¥Pythonãã€ã³ã¹ããŒã«ããããšèªäœã¯å¯èœã§ãããçŽæ¥ã€ã³ã¹ããŒã«ãããšããã®ãã·ã³ã§äœ¿ããPythonã¯ããã®ã€ã³ã¹ããŒã«ããããŒãžã§ã³ã®ã¿ã«éãããŠããŸããŸãã
ã€ã³ã¹ããŒã«ãããã®ãšç°ãªãããŒãžã§ã³ã®Pythonã䜿ããªããã°ãªããªãå Žåãä»ã®Pythonãã¢ã³ã€ã³ã¹ããŒã«ããæ°ããå¿
èŠãªããŒãžã§ã³ã®Pythonãã€ã³ã¹ããŒã«ããå¿
èŠãçããŸãããšãŠãé¢åã§ããã
pyenvã䜿ãã°ãéœåºŠäœ¿ãããããŒãžã§ã³ãã€ã³ã¹ããŒã«âãããžã§ã¯ãããšã«ããŒãžã§ã³ã®ç°ãªãPythonã䜿ãåããããšããæäœãã§ããããã«ãªããŸãã
ã€ã³ã¹ããŒã«
pyenvã®Githubã«åOSããšã®ã€ã³ã¹ããŒã«æ¹æ³ãæžãããŠããŸãã
macãªãã°ãHomebrewã§ã³ãã³ãäžçºã§ãã
brew install pyenv
äœ¿ãæ¹
ç¹å®ã®ããŒãžã§ã³ã®ã€ã³ã¹ããŒã«
pyenv install 3.10.1
ã€ã³ã¹ããŒã«æžã¿&䜿çšäžã®ããŒãžã§ã³ã®ç¢ºèª
pyenv versions
ç¹å®ã®ããŒãžã§ã³ã䜿çšããããã«èšå®
pyenv global 3.10.1
ç¹å®ã®ãããžã§ã¯ãå ã§äœ¿çšããããŒãžã§ã³ãèšå®
pyenv local 3.10.1
ãã詳ããäœ¿ãæ¹ã¯å ¬åŒGitHubãã芧ãã ããã
ããã±ãŒãžç®¡çã»ä»®æ³ç°å¢ç®¡ç
åçš®ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«ããã³ã¢ããã°ã¬ãŒãããããŠã©ã€ãã©ãªéã®äŸåé¢ä¿ãªã©ãæŽçããŠãããã®ãããã±ãŒãžç®¡çãœããã§ãã
ãããžã§ã¯ãããšã«ã䜿çšããã©ã€ãã©ãªã»ãããåããä»®æ³ç°å¢ç®¡çãéçºã«éèŠãªèŠçŽ ã®äžã€ã§ããå°çšã®ãœããããããŸãããè¿å¹Žã§ã¯ããã±ãŒãžç®¡çãœããã«æ©èœãšããŠåãã£ãŠããã±ãŒã¹ãå€ãã§ãã
Poetry
Pythonã®ããã±ãŒãžç®¡çãœãããšããŠã¯ãPython3.4以éã«æšæºä»å±ããŠããpipã æ¯èŒçæ°ãããä»®æ³ç°å¢æ§ç¯ãã§ããpipenvãªã©ããããŸãããæ°ãããããè¯ããã®ãéžã¶ãªãã°ãPoetryã«è»é ããããã§ãããã
Poetryã¯Python3.5以äžã§ãµããŒããããŠããŸãã(Poetry 1.1ç³»)
ãŸãä»åŸãPython3.5ããµããŒã察象ããå€ããäºå®ã§ãã®ã§ã䜿çšããéã«ã¯æ³šæããŸãããã
pipæä»£ã¯ãrequirements.txtã«äœ¿çšã©ã€ãã©ãªãäžèŠ§ç®¡çãããŠããã®ã¿ã ã£ãPythonãããžã§ã¯ãã§ãããPoetryã䜿ãã°ãäŸåé¢ä¿ããã£ãã解決ããŠãããŸãã
Poetryã§ã¯ãpyproject.tomlãšããtoml圢åŒã®ãã¡ã€ã«ã«ã䜿çšã©ã€ãã©ãªãšãã®äŸåé¢ä¿ãæŽçãããŸãã
ã€ã³ã¹ããŒã«
Poetryã®ã€ã³ã¹ããŒã«æé ã¯äžèšå ¬åŒããã¥ã¡ã³ããã芧ãã ããã
macã§Homebrewãå©çšããŠãããªãã°ã以äžã§ãã€ã³ã¹ããŒã«å¯èœã§ããïŒå ¬åŒéæšå¥šïŒ
brew install poetry
以äžã®ã³ãã³ãã§ãPoetry (version 1.1.0)ãšãã£ãããŒãžã§ã³æ
å ±ã衚瀺ãããã°ã€ã³ã¹ããŒã«æåã§ãã
poetry -V
Pythonãããžã§ã¯ãäœæ
poetryã³ãã³ãã§ãPythonãããžã§ã¯ãã®äœæãã§ããŸãã
poetry new poetry-demo
æåãããšã以äžã®ãããªãã¡ã€ã«ã»ãã£ã¬ã¯ããªçŸ€ãçæãããŸãã
poetry-demo
âââ README.md
âââ poetry_demo
â  âââ __init__.py
âââ pyproject.toml
âââ tests
âââ __init__.py
pyproject.tomlããããã±ãŒãžã®äŸåé¢ä¿ãæŽçããŠãããŸããåæç¶æ ã§ã¯ãäžèº«ã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
readme = "README.md"
packages = [{include = "poetry_demo"}]
[tool.poetry.dependencies]
python = "^3.11"
[build-system]
requires = ["poetry-core"]
ä»®æ³ç°å¢èµ·åïŒã©ã€ãã©ãªã€ã³ã¹ããŒã«
以äžã®ã³ãã³ãã§ãä»®æ³ç°å¢ã®èµ·åãè¡ããŸãã
poetry shell
å®è¡ãããšãã³ãã³ãããã³ããã®å·Šã«ãèµ·åããŠããä»®æ³ç°å¢ã衚瀺ãããŸãã
(poetry-demo-py3.11) user@hogehoge:~/poetry-demo $
詊ãã«scikit-learnãšããã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŠã¿ãŸãããã
poetry add scikit-learn
å®è¡çµæã®äžéšã«ã以äžã®ãããªé ç®ã衚瀺ãããŸãã
Package operations: 5 installs, 0 updates, 0 removals
⢠Installing numpy (1.24.0)
⢠Installing joblib (1.2.0)
⢠Installing scipy (1.9.3)
⢠Installing threadpoolctl (3.1.0)
⢠Installing scikit-learn (1.2.0)
scikit-learnãã€ã³ã¹ããŒã«ããéã«ãnumpyãªã©ã®å¥ã®ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ãããããšãããããŸãã
pyproject.tomlã¯ä»¥äžã®ããã«å€åããŸããã
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
readme = "README.md"
packages = [{include = "poetry_demo"}]
[tool.poetry.dependencies]
python = "^3.11"
scikit-learn = "^1.2.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.poetry.dependencies]ã«ãscikit-learnã远å ãããŠããŸããããããžã§ã¯ãã®äŸåã©ã€ãã©ãªã¯ããã®ããã«è¿œå ãããŠãããŸãã
Linter
Linterã¯ãã³ãŒãã®éçè§£æãè¡ããåé¡ç¹ãç¡ããããã§ãã¯ããŠãããããŒã«ã§ãã
Pythonã®LinterãšããŠã¯ãpylintãflake8ãªã©ãæåã§ãã
ã³ãŒãã®ä¿å®æ§ã»å®å
šæ§ãä¿ã€ããã«ãã¹ããªã®ã§ãå¿
ã䜿çšããããšãããããããŸãã
flake8
çŸåšããå€ã䜿ãããŠããã®ã¯flake8ã«ãªããšæããŸãã
flake8ã¯äžèšã®3ã€ã®ã©ã€ãã©ãªããŸãšãŸã£ãã©ãããŒã©ã€ãã©ãªã§ãææ³ã»ã³ãŒãã£ã³ã°èŠçŽã»è€éãããŸãšããŠãã§ãã¯ããŠããã®ã匷ã¿ã§ãã
- PyFlakes
- Pythonã®ææ³ã«æºæ ããŠãããããã§ãã¯ããŸãã
- pycodestyle
- å ã ã¯pep8ãšããã©ã€ãã©ãªã§ããã
- PEP8ãšããPythonã³ãŒãã£ã³ã°èŠçŽã«æºæ ããŠãããããã§ãã¯ããŸãã
- Ned Batchelderâs McCabe scriptïŒMcCabe)
- Pythonã³ãŒãã®è€éã(埪ç°çè€é床)ããã§ãã¯ããŸãã
ã€ã³ã¹ããŒã«
å ¬åŒããã¥ã¡ã³ãã§ã¯ãpipã䜿ã£ãã€ã³ã¹ããŒã«æ¹æ³ãã玹ä»ãããŠããŸããã
Poetryã䜿ã£ãã€ã³ã¹ããŒã«æ¹æ³ã¯ä»¥äžã®éãã§ããïŒ-Dã¯devã¢ãŒããéçºæã«ã®ã¿å¿
èŠãªã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããéã®ãªãã·ã§ã³ã§ããïŒ
poetry add flake8 -D
ã€ã³ã¹ããŒã«å®äºåŸãflake8 --versionãå®è¡ãããšã以äžã®æ§ãªçµæã衚瀺ãããã¯ãã§ãã
6.0.0 (mccabe: 0.7.0, pycodestyle: 2.10.0, pyflakes: 3.0.1) CPython 3.11.0 on Darwin
äžè¿°ãã3ã©ã€ãã©ãªïŒmmcabe, pycodestyle, pyflakesïŒãããããå å ãããŠããããšãããããŸããã
äœ¿ãæ¹
è§£æããããããžã§ã¯ããã£ã¬ã¯ããªã§ã以äžã®ã³ãã³ããå®è¡ããã ãã§ãã
flake8
ãŸããè§£æå¯Ÿè±¡ãç¹å®ã®ãã¡ã€ã«ã«éå®ããããšãã§ããŸãã
flake8 main.py
Formatter
Linterãã³ãŒãã®åé¡ç¹ãè§£æããŠãããã®ã«å¯ŸããŠãã³ãŒãã®ã¹ã¿ã€ã«ããã§ãã¯ããèªåä¿®æ£ããŠãããã®ãFormatterã§ãã
Pythonã®ã³ãŒãã¹ã¿ã€ã«ã«ã€ããŠã¯ãã³ãŒãèŠçŽã§ããPEP8ã«åŸãã®ããŸã第äžãªã®ã§ãããèŠçŽã§ã¯ã«ããŒããŠããªãéšåã«ã€ããŠãã«ãŒã«ãå®ããŠèªåä¿®æ£ããŠãããŸãã
äŸãã°ã·ã³ã°ã«ã¯ã©ãŒããŒã·ã§ã³ãšããã«ã¯ã©ãŒããŒã·ã§ã³ã®äœ¿ãåããæ¹è¡ã®äœçœ®ãªã©ãå人差ãçãããããªéšåã«ã€ããŠã¯ãFormatterã§ã«ãããªãšå®ããŠããŸãã»ããã誰ã«ãšã£ãŠãèªã¿ãããã³ãŒãã«ãªããŸãã
Black
ä»ã«ãissortãªã©ã®ã©ã€ãã©ãªãååšããŸãããçŸåšæãããã¡ã¯ãã¹ã¿ã³ããŒãã«è¿ãã®ã¯Blackã ãšèšããã§ãããã
Blackã®å€§ããªç¹åŸŽã¯ãåå¥èšå®ã«ããããªãšãŒã·ã§ã³ãèš±ããªã峿 Œãã«ãããŸãã
ã峿 Œããšãããšçª®å±ã«æãããããããŸãããããã©ãŒãããã峿 Œã«åºå®ãããããšã§ããã©ãæžããããæ°ã«ããããè°è«ãããããäžåã®æéãçããããšããããšã§ããããŸãã
ãã®åãããã¯ãªãŒã³ãªã³ãŒãã®æžãæ¹ããããéèŠãªãã¡ã€ã³ç¥èã®èå¯ãªã©ã«å²ããæéãå¢ããã®ã¯ããšã³ãžãã¢ã«ãšã£ãŠå€§ããªã¡ãªããã«ãªããŸãã
ã€ã³ã¹ããŒã«
ãã¡ããå ¬åŒãµã€ãã«ã¯pipã§ã®ã€ã³ã¹ããŒã«æ¹æ³ããæžãããŠããŸããããPoetryã§ãã€ã³ã¹ããŒã«å¯èœã§ãã
poetry add black -D
äœ¿ãæ¹
flake8ãšåãããã³ãã³ãäžçºã§äœ¿çšã§ããŸãã
black (ãã¡ã€ã« or ãã£ã¬ã¯ããª)
å ¬åŒããã¥ã¡ã³ãã§ãããçºå±çãªäœ¿ãæ¹ã確èªã§ããŸãã
isort
Blackãšäœµçšããããã¿ãŒã³ãå¢ããŠæ¥ãŠããããã§ããå ¬åŒã§ããBlackãšã®äœµçšã»äºææ§ã«ã€ããŠèª¬æãããŠããŸãã
importæãPEP8æºæ ã«ãœãŒãããŠãããFormatterã§ããè€æ°ã®ã¢ãžã¥ãŒã«ãimportãããšãimportæã®é çªããã¡ããã¡ãã«ãªããããã®ã§ãããã䜿ã£ãŠä¿®æ£ããããšã§å¯èªæ§ãäžããŠãããããšããã§ãã
åäœãã¹ã
åäœãã¹ã(ãŠããããã¹ã)ã¯ãããã°ã©ã ã®æå°æ§æåäœ(äŸãã°é¢æ°)ãæ£ããåäœããããšã確èªããããã«è¡ããã¹ãã§ãã
æ©èœã®å®è£
ã«ã°ãã远ãããŠãã¹ããæžããªããŸãŸã«ããŠãããšããã€ã®éã«ãããã°ã©ã å
šäœã®åäœã®æ
ä¿ãé£ããããã€ä¿®æ£ãå°é£ãªç¶æ³ã«è¿œã蟌ãŸããŠãããŸãã
åäœãã¹ãããŒã«ã¯ããããžã§ã¯ãäœææ®µéããå°å ¥ãã¹ãã§ããåŸåãã«ããŠè¯ãçç±ã¯ãããŸããã
pytest
Pythonã«ã¯æšæºã©ã€ãã©ãªãšããŠunittestããããŸãããçŸåšã®ããã¡ã¯ãã¹ã¿ã³ããŒããšããã°pytestã«ãªããšæããŸãã
unittestã®æ¬ ç¹ãã«ããŒããç®çã§éçºãããã©ã€ãã©ãªã§ãæ¯åãã¹ãã¯ã©ã¹ãå®çŸ©ããªããã°ãªããªãunittestãšéãã颿°åäœã§ã·ã³ãã«ã«ãã¹ãã远å ã§ããç¹ãªã©ãé
åã§ãããŸãunittestçšã«æžããããã¹ããå®è¡ã§ãããããunittestããã®ç§»è¡ãç°¡åã«ã§ããŸãã
æ¡åŒµæ©èœãè±å¯ã§ããã¹ãã«ãã¬ããžãèšç®ããŠãããpytest-covãªã©ã¯ç¹ã«äŸ¿å©ã§ãã
ã€ã³ã¹ããŒã«
äŸã«ãã£ãŠpipã§ã€ã³ã¹ããŒã«ããå Žåã¯å ¬åŒããã¥ã¡ã³ããåç §ããŠãã ããã
Poetryã䜿ãå Žåã¯ä»¥äžã§ãã
poetry add pytest -D
äœ¿ãæ¹
äžèšã®ã³ãã³ãã§ãå®è£ ãããã¹ã颿°ããã¹ãããŠãããŸãã
poetry run pytest
ãã¹ã颿°ã®æžãæ¹ãªã©ã¯ãããã¥ã¡ã³ãã«è©³ããæžããŠããŸããã
- ãã¡ã€ã«åã®prefixãã
test_***.py - 颿°åã®prefixãã
test__ÃÃÃ
ãšããŠå®çŸ©ããã°ãpytestã®ãã¹ã察象ãšãªããŸãã
åå®çŸ©ã»è§£æ
Pythonã¯åçåä»ãèšèªãªã®ã§ãåãå®çŸ©ããå¿
èŠããããŸããã
ãã3.5系以éã¯åãã³ããä»ããããšãå¯èœã«ãªããçŸåšã¯å€ãã®ãããžã§ã¯ãã§ãä¿å®æ§ã»å¯èªæ§ã®èгç¹ããçšããããŠããŸãã
ãšãã£ã¿ã®æ¡åŒµæ©èœãªã©ãå«ããåã®å°å ¥ã»éçè§£æãã§ããç°å¢ãçšæããããšã¯ãã¢ãã³ãªPythonãããžã§ã¯ãã§ã¯ãã»ãŒå¿ é æ¡ä»¶ãšèšããã§ãããã
typing
Pythonã®æšæºã©ã€ãã©ãªã®äžã€ã§ãæè»ãªå衚çŸãå°å
¥ããåãã³ããå©ããŠãããããŒã«ã§ãã
3.5系以éã®Pythonãªãã°ãimportããã ãã§äœ¿ããŸãã
from typing import List
def hoge() -> List[int]:
return [0, 1, 2]
print(hoge())
ãããªåœ¢ã§hoge颿°ã®è¿ãå€ãšããŠintã®listãæå®ã§ãããªã©ãtypingãå°å
¥ããããšã§ä»ããããåãã³ãã®ããªãšãŒã·ã§ã³ã¯ã°ããšåºãããŸãã
åãšã€ãªã¢ã¹ïŒåãåœåããŠäœ¿ãïŒãªã©ã®äŸ¿å©ãªæ©èœããããŸãã®ã§ããã詳ããäœ¿ãæ¹ã¯å ¬åŒããã¥ã¡ã³ããã芧ãã ããã
mypy
Pythonåãã§ãã¯ã©ã€ãã©ãªã®å
é§ãçååšã§ããããã€ããã¡ã¯ãã¹ã¿ã³ããŒããšåŒã¹ãã©ã€ãã©ãªã§ãã
è¥å¹²éãã®ãæ¬ ç¹ã§ãããä»ã«äŸåããèŠçŽ ããªããã·ã³ãã«ãã€ååãªæ©èœãæããŠããŸãã
ã€ã³ã¹ããŒã«
Poetryã䜿ã£ãã€ã³ã¹ããŒã«ã¯äžèšã®ãšããã§ãã
poetry add mypy -D
äœ¿ãæ¹
poetry runã®ãµãã³ãã³ããšããŠå®è¡ããŸãã
poetry run mypy (ãã¡ã€ã« or ãã£ã¬ã¯ããª)
ãã¹ãã»è§£æç®¡ç
Nox
Noxã¯è€æ°ã®ãã¹ããè§£æããŒã«ã管çããŠãããããŒã«ã§ãtoxã®åŸç¶ã«ããããŸãã
ãããŸã§ç޹ä»ããŠããåçš®ããŒã«ããç¬ç«ããç°å¢ã§èªç±ã«åããããšãã§ããŸãã
Noxã®ç¹åŸŽãšããŠã¯ãèšå®ãã¡ã€ã«ãPythonã¹ã¯ãªãããšããŠæžããç¹ã§ããnoxfile.pyãšãããã¡ã€ã«ãäœæããå®è¡ããããã¹ãã远å ããŠãããŸãã
ã€ã³ã¹ããŒã«
poetry add nox -D
äœ¿ãæ¹
noxfile.pyã¯ä»¥äžã®ããã«èšèŒããŠããŸãã
import nox
import nox
@nox.session
def tests(session):
session.install('pytest')
session.run('pytest')
@nox.session
def lint(session):
session.install('flake8')
session.run('flake8')
å®è¡ã¯ã³ãã³ããå©ãã ãã§ãã
nox
ãã¹ãèªåå
CircleCIãGithub Actionsãªã©ã®CI/CDãµãŒãã¹ã¯å€ãã®ãããžã§ã¯ãã§å©çšãããŠããŸãããã³ãããåã«å šãŠã®ãã¹ããéããŠããã°ãããããã«ãã€ãã©ã€ã³ãèœãšãããšããªããä»ã®ã¡ã³ããŒã«åœ±é¿ãäžããããšããããŸããã
Gitã«ã¯ãã³ãããåã«ä»»æã®ã¢ã¯ã·ã§ã³ãèªåå®è¡ããŠãããpre-commitããã¯ããããŸãã
ãããã®èšå®ã¯.git/hooks以äžã«èšèŒãããããããŒã éçºãªã©ã§ã¯èšå®ãç°¡åã«å
±æã§ããªãã®ãããã¯ã§ããããã解決ããããã«ãpre-commitãšããïŒååãã®ãŸããŸãªïŒå€èšèªããã±ãŒãžãããŒãžã£ãéçºãããŠããŸãã
pre-commit
pre-commitã¯ãå
šãŠã®ã³ãããã®åã«ããããããã¯ã®ã€ã³ã¹ããŒã«ãšå®è¡ãè¡ã£ãŠããã管çããŒã«ã§ãã
ããã¯ããŠç»é²ããããã¹ããè§£æã¯ã.pre-commit-config.yamlãšãããã¡ã€ã«ã§ã¹ãããå¥ã«èšè¿°ã»ç®¡çããŸãã.pre-commit-config.yamlèªäœããã¡ããã³ãããããããšãã§ããã®ã§ãã³ãããåã«èªåå®è¡ãããããããæé ãããŒã å
ã§å
±éåããããšãã§ããŸãã
ã€ã³ã¹ããŒã«
poetry add pre-commit -D
äœ¿ãæ¹
äŸãã°ã³ãããåã«flake8ãå®è¡ãããå Žåã¯ã以äžã®ãããªåœ¢ã§pre-commit-config.yamlãèšè¿°ããŸãã
repos:
- repo: local
hooks:
- id: flake8
name: flake8
entry: poetry run flake8
language: system
types: [python]
yamlãã¡ã€ã«ã®èšå®ã¯ã以äžã®ã³ãã³ãã§.git/hooks以äžã«åæ ãããŸãã
pre-commit install
ããã§ãèšå®ããããã¯ãã³ãããåã«èµ°ãã®ã§ãããpre-commit run --all-filesãå©ããŠæåå®è¡ãå¯èœã§ãã
ãã詳ããäœ¿ãæ¹ã¯ãå
¬åŒããã¥ã¡ã³ããã芧ãã ããã
ãããã«
æ¬èšäºã§ã¯ãææ°ã®Pythonãããžã§ã¯ãã§çšããããããŒã«ã«ã€ããŠãçšéããšã«è§£èª¬ããŠããŸããã
Pythonã³ãã¥ããã£ã§ã¯ãããã§ç޹ä»ãã以å€ã«ãå€ãã®åªããããŒã«ã矀é岿 ããŠããããããã¡ã¯ãã¹ã¿ã³ããŒãã¯ããããäžæŠã«ã¯èšãåããªãã±ãŒã¹ãå€ãã®ã§ããããã®èšäºã§è§ŠããŠãããã®ã«ã€ããŠã¯ããŸãå
¥ããŠãããŠæã¯ãªãããŒã«çŸ€ããŸãšããã€ããã§ãã
ããããã£ãšè¯ãããŒã«ãããããäžçªäœ¿ããããLinterã¯ããã ããšãã£ããæèŠãããããŸããããã³ã¡ã³ãã§æããŠããã ãããšå¬ããã§ãã
åŒç€Ÿã§ã¯ãçµéšã®æç¡ãåããã瀟å¡ãã€ã³ã¿ãŒã³çã®æ¡çšãè¡ã£ãŠããŸãã
èå³ã®ããæ¹ã¯ãã¡ããã芧ãã ããã