вторник, 1 июля 2025 г.

Poetry, project, 25.06.30

Poetry, project, 25.06.30

https://ask.chadgpt.ru/share/787df0b0-1a72-4937-b4db-773375a1e2d

Я создал проект poetry c зависимостями

- black
-
flake8
-
isort
-
mypy
-----------------
Мы все это время находились в окружении
conda (base)
Мы ввели все зависимости указанные выше в файл
pyproject.toml
Но находимся в окружении
base (conda)
Как нам дальше перейти к окружению
poetry c указанным зависимостями ?

Хорошо, разъясню порядок перехода с окружения conda (base) к использованию окружения, созданного с помощью poetry, с уже прописанными зависимостями.

1.  Выйдите из conda-окружения
Вы можете просто деактивировать активное окружение командой:

conda deactivate

(но находиться в (base) — это не критично, просто для порядка).

1.  Создайте виртуальное окружение через poetry
В командной строке в папке вашего проекта выполните команду:

poetry install

Эта команда создаст новое виртуальное окружение (используя системный python или тот, который вы явно указали), и установит все зависимости, перечисленные в pyproject.toml.

1.  Активируйте окружение poetry
Чтобы попасть в это окружение, используйте:

poetry shell

Теперь вы находитесь именно в poetry-окружении, а не под conda.

1.  Проверка
Проверьте, что зависимости установились:

black --version

flake8 --version

isort --version

mypy --version

Если команды работают — всё готово.

Кратко:
Вызывайте
poetry install, затем poetry shell, и все нужные пакеты будут внутри poetry-окружения.

Если будут вопросы — пишите!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry install
Updating dependencies
Resolving dependencies... (1.7s)

Package operations: 14 installs, 0 updates, 0 removals

- Installing colorama (0.4.6)
- Installing click (8.2.1)
- Installing mccabe (0.7.0)
- Installing mypy-extensions (1.1.0)
- Installing packaging (25.0)
- Installing pathspec (0.12.1)
- Installing platformdirs (4.3.8)
- Installing pycodestyle (2.14.0)
- Installing pyflakes (3.4.0)
- Installing typing-extensions (4.14.0)
- Installing black (25.1.0)
- Installing flake8 (7.3.0)
- Installing isort (6.0.1)
- Installing mypy (1.16.1)

Writing lock file

Installing the current project: annotation-proj (0.1.0)
Error: The current project could not be installed: Readme path `D:\VC25\Otus\Py\250610\projects\annotation_proj\README.md` does not exist.
If you do not want to install the current project use --no-root.
If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.
If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.

Ваша ошибка:

> The current project could not be installed: Readme path ...README.md does not exist.

Ознчает, что в вашем pyproject.toml явно указан файл README.md (например, в секции [project] в поле readme = "README.md"), но такого файла в папке нет.

Вот что делать:

1.  Создайте пустой README.md
Просто создайте текстовый файл
README.md в папке проекта. Достаточно даже пустого файла:

o    Откройте PowerShell в этой папке и введите:

     echo. > README.md

  • Или создайте файл с помощью любого текстового редактора.

1.  Повторите команду

   poetry install

Теперь ошибка уйдёт.

Почему так происходит?
Poetry строго проверяет наличие всех файлов, которые вы указываете в pyproject.toml, и не запускает установку проекта, если чего-то не хватает.

Альтернативные варианты:

  • Если вы не планируете пока собирать или публиковать проект — можно добавить флаг --no-root, чтобы не пытаться установить сам проект, только зависимости:

  poetry install --no-root

  • Если проект не будет пакетом — добавьте в [tool.poetry]:

  package-mode = false

  • Но обычное решение — просто создать README.md, пусть даже пока пустой.

Если получится ошибка снова – дайте знать, помогу!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry install
Installing dependencies from lock file

No dependencies to install or update

Installing the current project: annotation-proj (0.1.0)
Error: The current project could not be installed: No file/folder found for package annotation-proj
If you do not want to install the current project use --no-root.
If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.
If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.

PS D:\VC25\Otus\Py\250610\projects\annotation_proj>


файл создал README.md

Отлично, что создали README.md! Но, судя по ошибке:

Error: The current project could not be installed: No file/folder found for package annotation-proj

If you do not want to install the current project use --no-root.

If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.

If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.

Теперь Poetry не может найти сам пакет (код вашего проекта). Обычно это бывает, если:

  • Нет папки с исходным кодом.
  • Неправильно указан путь к пакетам в pyproject.toml.
  • В настройках Poetry не указано, где лежит ваш пакет.

Что делать:

1.  Проверьте структуру проекта.Обычно для poetry проект выглядит так:

   annotation_proj/

     pyproject.toml

     README.md

     annotation_proj/

       __init__.py

       ...другие файлы кода...

То есть внутри корневой папки вашего проекта должна быть вложенная папка с вашим пакетом и с файлом __init__.py.

1.  Проверьте pyproject.toml.В секции [tool.poetry] должно быть:

   name = "annotation-proj"

и опционально секция, указывающая путь к пакетам:

   [tool.poetry]

   ...

   packages = [

     { include = "annotation_proj" }

   ]

Имя в "include" — это имя вложенной папки с вашим кодом.

1.  Создайте нужную папку и init.py, если их нет.Например, выполните:

   mkdir annotation_proj

   type nul > annotation_proj\__init__.py

1.  Снова выполните

   poetry install

Теперь установка должна пройти успешно.

Если проект не является библиотекой, а только скриптом (например, у вас только main.py):

  • Можно добавить в [tool.poetry] параметр:

  package-mode = false

Тогда Poetry не будет ждать наличие самого пакета.

Если появятся ещё ошибки или потребуется показать структуру вашего проекта и содержимое pyproject.toml — просто отправьте их сюда, я помогу точнее!

[project]
name = "annotation-proj"
version = "0.1.0"
description = "annotation testing"
authors = [
{name = "Your Name",email = "you@example.com"}
]
license = {text = "1"}
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"black (>=25.1.0,<26.0.0)",
"flake8 (>=7.3.0,<8.0.0)",
"isort (>=6.0.1,<7.0.0)",
"mypy (>=1.16.1,<2.0.0)"
]

Ваш pyproject.toml выглядит в целом правильно, но есть пара моментов, которые могут вызывать ошибки при poetry install, особенно если вы делаете проект как “библиотеку” (а не просто как набор скриптов).

1.  Нет секции packages
Если у вас есть пакет (папка с
init.py), укажите какие папки включать в дистрибутив, иначе poetry выдаст ошибку, что не видит пакет. Например:

[tool.poetry]

name = "annotation-proj"

version = "0.1.0"

description = "annotation testing"

authors = [

    {name = "Your Name", email = "you@example.com"}

]

license = {text = "MIT"}

readme = "README.md"

requires-python = ">=3.12"

dependencies = [

    "black>=25.1.0,<26.0.0",

    "flake8>=7.3.0,<8.0.0",

    "isort>=6.0.1,<7.0.0",

    "mypy>=1.16.1,<2.0.0"

]

 

[tool.poetry.packages]

include = ["annotation_proj"]

(Заметьте: В poetry всегда используют [tool.poetry], а не [project])

1.  Секция [project] или [tool.poetry]?
Poetry
официально работает только с секцией [tool.poetry] (не [project] как для PEP 621/pip). Для poetry обязательно переименуйте [project] на [tool.poetry]!

2.  Зависимости
Удалите скобки для зависимостей, пишите их как строки, пример выше.

3.  Лицензия

license = "MIT"

а не {text = "1"}.

Финальный пример:

[tool.poetry]

name = "annotation-proj"

version = "0.1.0"

description = "annotation testing"

authors = [

    {name = "Your Name", email = "you@example.com"}

]

license = "MIT"

readme = "README.md"

packages = [{ include = "annotation_proj" }]

requires-python = ">=3.12"

dependencies = [

    "black>=25.1.0,<26.0.0",

    "flake8>=7.3.0,<8.0.0",

    "isort>=6.0.1,<7.0.0",

    "mypy>=1.16.1,<2.0.0"

]

Важно:
Должна быть папка
annotation_proj с файлом __init__.py (пусть даже пустой).

Если проект — только один main.py (не библиотека, а просто скрипты):

Удалите секцию packages, и добавьте в [tool.poetry] строчку:

package-mode = false

Если что-то не получается — напишите структуру файловой системы проекта и код ошибки!

У меня будет
- набор скриптов независимых будет
- тестирование каждого скрипта

В вашем случае, когда проект состоит из набора отдельных скриптов (а не библиотеки с пакетами), лучше использовать стандартный (Package mode off) режим Poetry. Вот минимальный пример pyproject.toml, адаптированный под ваш сценарий:

[tool.poetry]

name = "annotation-proj"

version = "0.1.0"

description = "annotation testing — независимые скрипты"

authors = [{ name = "Your Name", email = "you@example.com" }]

license = "MIT"

readme = "README.md"

package-mode = false

requires-python = ">=3.12"

 

[tool.poetry.dependencies]

# Тут ваши зависимости, если нужны (модули, которые используются в скриптах)

 

[tool.poetry.group.dev.dependencies]

black = "^25.1.0"

flake8 = "^7.3.0"

isort = "^6.0.1"

mypy = "^1.16.1"

pytest = "^8.2.2"  # для тестирования скриптов

 

[build-system]

requires = ["poetry-core"]

build-backend = "poetry.core.masonry.api"

Структура проекта:

annotation-proj/

   pyproject.toml

   README.md

├── script1.py

├── script2.py

└── tests/

    ├── test_script1.py

    └── test_script2.py

  • Скрипты просто лежат в корне или папке (например, все скрипты в scripts/).
  • Для тестирования создайте папку tests/ и пишите тесты в формате test_*.py (pytest это поддержит автоматически).
  • Для запуска тестов используйте poetry run pytest.

Если что-то не получается или нужна помощь с настройкой тестирования — дайте знать!

Файл pyproject.toml исправил
[tool.poetry]
name = "annotation-proj"
version = "0.1.0"
description = "annotation testing — независимые скрипты"
authors = [{ name = "Your Name", email = "you@example.com" }]
license = "MIT"
readme = "README.md"
package-mode = false
requires-python = ">=3.12"

[tool.poetry.dependencies]
# Тут ваши зависимости, если нужны (модули, которые используются в скриптах)

[tool.poetry.group.dev.dependencies]
black = "^25.1.0"
flake8 = "^7.3.0"
isort = "^6.0.1"
mypy = "^1.16.1"
pytest = "^8.2.2" # для тестирования скриптов

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"


[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
------------------
PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry install

D:/VC25/Otus/Py/250610/projects/annotation_proj/pyproject.toml is not a valid TOML file.
TOMLDecodeError: Cannot declare ('build-system',) twice (at line 26, column 14)

Ошибка связана с тем, что в файле pyproject.toml дважды объявлен блок [build-system]. В TOML каждый блок может быть только один раз.
Вам нужно оставить только одну секцию
[build-system]. Вот корректная версия вашего файла:

[tool.poetry]

name = "annotation-proj"

version = "0.1.0"

description = "annotation testing — независимые скрипты"

authors = [{ name = "Your Name", email = "you@example.com" }]

license = "MIT"

readme = "README.md"

package-mode = false

requires-python = ">=3.12"

 

[tool.poetry.dependencies]

# Тут ваши зависимости, если нужны (модули, которые используются в скриптах)

 

[tool.poetry.group.dev.dependencies]

black = "^25.1.0"

flake8 = "^7.3.0"

isort = "^6.0.1"

mypy = "^1.16.1"

pytest = "^8.2.2"  # для тестирования скриптов

 

[build-system]

requires = ["poetry-core>=2.0.0,<3.0.0"]

build-backend = "poetry.core.masonry.api"

Что делать:

1.  Удалите лишний блок [build-system], чтобы он был только один раз.

2.  Сохраните файл.

3.  Повторите команду poetry install.

Если возникнут ещё ошибки — пришлите их сюда, помогу разобраться!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry install

The Poetry configuration is invalid:
- tool.poetry.authors[0] must be string
- Additional properties are not allowed ('requires-python' was unexpected)

Спасибо за детали! Ошибки указывают на две основные проблемы в вашем pyproject.toml:

1.  authors должен быть строкой (или списком из строк), а не списком словарей.Должно быть так:

toml

authors = ["Your Name <you@example.com>"]

1.  Поле requires-python должно быть в [tool.poetry.dependencies], а не в корне секции.
То есть нужно вот так:

toml

[tool.poetry.dependencies]

python = ">=3.12"

# другие ваши зависимости

Вот пример корректного блока tool.poetry:

[tool.poetry]

name = "annotation_proj"

version = "0.1.0"

description = "несколько независимых скриптов"

authors = [

    "Your Name <you@example.com>"

]

license = "MIT"

readme = "README.md"

package-mode = false

 

[tool.poetry.dependencies]

python = ">=3.12"

# другие зависимости

 

[tool.poetry.group.dev.dependencies]

black = "^25.1.0"

flake8 = "^7.3.0"

isort = "^6.0.1"

mypy = "^1.16.1"

pytest = "^8.2.2"

 

[build-system]

requires = ["poetry-core>=2.0.0,<3.0.0"]

build-backend = "poetry.core.masonry.api"

Инструкция:

1.  Исправьте поля authors и requires-python как выше.

2.  Сохраните файл.

3.  Запустите снова poetry install.

Если появятся ещё сообщения об ошибках — присылайте сюда!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry install
Installing dependencies from lock file

pyproject.toml changed significantly since poetry.lock was last generated. Run `poetry lock` to fix the lock file.
PS D:\VC25\Otus\Py\250610\projects\annotation_proj

Сообщение говорит о том, что файл pyproject.toml был изменён, и теперь информация в нем не соответствует файлу poetry.lock. Необходимо пересобрать lock-файл.

Решение:
Введите в терминале:

poetry lock

Дождитесь завершения (Poetry обновит файл poetry.lock согласно текущему содержимому pyproject.toml).

После этого снова выполните:

poetry install

Это обновит зависимости и без ошибок установит всё нужное.
Если появится ошибка или другое сообщение — пришлите текст сюда!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry lock
Resolving dependencies... (0.8s)

Writing lock file
PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry install
Installing dependencies from lock file

Package operations: 4 installs, 0 updates, 0 removals

- Installing iniconfig (2.1.0)
- Installing pluggy (1.6.0)
- Installing pygments (2.19.2)
- Installing pytest (8.4.1)
PS D:\VC25\Otus\Py\250610\projects\annotation_proj>

Отлично! Все зависимости успешно установлены, ошибок больше нет.

Теперь вы можете работать с проектом: запускать скрипты, тесты или продолжать разработку, как планировали. Если потребуется помощь с дальнейшими шагами или появятся новые вопросы — пишите!

Сейчас у меня в терминале не поймешь какое окружение включено.
Давайте посмотрим в каком окружении мы работаем

Чтобы узнать, в каком виртуальном окружении вы сейчас находитесь, выполните одну из следующих команд в терминале PowerShell:

where python

или

python -c "import sys; print(sys.executable)"

Эти команды покажут путь к интерпретатору Python, который сейчас активен. Если Poetry активировал своё окружение, путь должен вести в .venv вашей папки проекта или в директорию, которую использует Poetry для создания виртуальных окружений.

Если путь ведёт в D:\VC25\Otus\Py\250610\projects\annotation_proj\.venv\Scripts\python.exe (или аналогичную папку внутри вашего проекта), значит, используется нужное окружение, созданное Poetry специально для этого проекта.

Если вижу результат — пришлите его сюда, я помогу точно определить, что всё настроено правильно.
Если окружение не активировано, подскажу как это сделать!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> where python
PS D:\VC25\Otus\Py\250610\projects\annotation_proj>

Команда where python ничего не вывела — это значит, что в вашем терминале переменная среды PATH не указывает на исполняемый файл Python, или Python не установлен глобально, или терминалу не известен путь к python.exe.

Попробуем следующее:

1.  Если Python установлен, попробуйте полное имя исполняемого файла:

where python.exe

или

where py

1.  Если вывод снова пустой, откройте новую вкладку/окно PowerShell и попробуйте ещё раз.

2.  Также попробуйте узнать, устанавливался ли Python через Microsoft Store — там он иногда появляется как отдельное приложение.

3.  Если никакой из вариантов не находит Python, проверьте, установлен ли он через:

py --version

или

python --version

1.  Если установлен Poetry, попробуйте запустить виртуальное окружение командой:

poetry shell

Затем снова проверьте:

where python

Если всё равно пусто:
Возможно,
Python не установлен на этой машине или его нет в PATH. Тогда нужно будет установить Python и/или прописать путь вручную.

Если видите путь к python.exe — присылайте вывод, я помогу с дальнейшей настройкой.

Если что-то не получается — напишите, какой именно шаг не срабатывает!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> where python
PS D:\VC25\Otus\Py\250610\projects\annotation_proj> where python.exe
PS D:\VC25\Otus\Py\250610\projects\annotation_proj> where py
PS D:\VC25\Otus\Py\250610\projects\annotation_proj>

Спасибо за детали!
Вывод команд пустой — система не находит
Python (и его "лаунчера" py), значит ни один из путей не прописан в переменную среды PATH, либо Python реально не установлен.

Проверьте, установлен ли Python:

1.  Откройте “Пуск” и введите Python. Если видите “Python 3.x” — выберите пункт “Открыть расположение файла” → ещё раз ПКМ → “Открыть расположение файла”. Так вы найдёте где лежит python.exe.

2.  Если не найден — нужно установить Python.

1.  После установки закройте терминал и откройте его заново.
Пропишите команду:

   where python

или:

   python --version

1.  Если теперь Python обнаружен — всё хорошо, можете пользоваться poetry и запускать проекты.

Если нужны дальнейшие инструкции — напишите, удалось ли найти или установить Python.

> Если стоит Anaconda/Miniconda, поиск может отличаться (и для нее активируется среда иначе). Если это ваш случай — уточните.

Я предлагаю все это удалить и начать проект с нуля.
Парметры
Мы работаем с
WIndows
Мы должны найти окружение
Poetry.
Сформировать правильно .
toml файл.
Нам нужны следующие зависимости
-
black
-
flake8
-
isort
-
mypy
-
pytest
---------------------
Как я уже сказал содержание проекта
- независимые скрипты .
py
-
test для каждого скрипта
Цель проекта запустить определенный
tests для каждого скрипта.
Спроектируй структуру проекта
надо найти окружение с
poetry - оно где-то есть на компе.
У нас
WIndows
Поехали я удалили старый прект.
Должно пройти все гладко.

Отлично, начнем с самого начала.
Я приведу все нужные шаги максимально подробно для
Windows, чтобы создать новый чистый проект с указанными зависимостями и структурой.


ШАГ 1. Проверка и поиск Poetry на компьютере

Откройте командную строку (Win+RcmdEnter) и введите:

poetry --version

Если увидели версию — Poetry уже установлен и в PATH.
Если получили ошибку “не является внутренней или внешней командой…” —
Poetry либо не установлен, либо не в PATH.

Если Poetry не установлен:
Официальная команда для
Windows (PowerShell!):

(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

Дальше перезапустите терминал и снова проверьте через

poetry --version


ШАГ 2. Создание новой папки проекта

Выберите/создайте директорию, где будет проект. Например, C:\Users\your_name\projects\my_scripts_project.

Откройте терминал в этой папке.


ШАГ 3. Инициализация Poetry-проекта

Выполните:

poetry init

Poetry задаст вопросы, вы можете просто нажимать Enter для пропуска (будем редактировать файл вручную).
или сразу:

poetry init --no-interaction

В папке появится pyproject.toml.


ШАГ 4. Редактирование pyproject.toml

Откройте pyproject.toml — убедитесь, что там есть только ваши секции. Добавьте зависимости в секцию [tool.poetry.dependencies] (для runtime, если нужны, например, Python) и [tool.poetry.dev-dependencies] (для инструментов):

[tool.poetry]

name = "my_scripts_project"

version = "0.1.0"

description = "A collection of independent scripts with tests"

authors = ["Your Name <you@example.com>"]

readme = "README.md"

 

[tool.poetry.dependencies]

python = "^3.11"

 

[tool.poetry.dev-dependencies]

black = "^24.0.0"

flake8 = "^7.0.0"

isort = "^5.12.0"

mypy = "^1.8.0"

pytest = "^8.1.1"

Версию Python подберите по вашей системе, или возьмите вс-текущий Python 3.10 или 3.11.


ШАГ 5. Установка зависимостей

В терминале выполните в папке проекта:

poetry install

Poetry сам создаст виртуальное окружение внутри вашего профиля и установит всё из toml.


ШАГ 6. Структура проекта

Рекомендую сделать так:

my_scripts_project/

├─ pyproject.toml

├─ README.md

├─ scripts/

    ├─ script1.py

    ├─ script2.py

    └─ ...

└─ tests/

     ├─ test_script1.py

     ├─ test_script2.py

     └─ ...

scripts/ — для всех независимых .py-скриптов
tests/ — для тестов (pytest) к каждому скрипту


ШАГ 7. Пример простого скрипта и теста

scripts/hello.py:

def greet(name):

    return f"Hello, {name}!"

tests/test_hello.py:

from scripts.hello import greet

 

def test_greet():

    assert greet("Alice") == "Hello, Alice!"


ШАГ 8. Запуск тестов

В терминале, из корня проекта запуск:

poetry run pytest


Рекомендации по редактору
Чтобы
Poetry-окружение подхватывалось автоматически, для VSCode рекомендую расширение Python + Poetry (если используете Pycharm: просто выберите poetry-virtualenv как интерпретатор).


Дальнейшие вопросы, если что-то не работает — говорите, подскажу!

я ввел в .toml
-
black
-
flake8
-
isort
-
mypy
Как называется модуль для Тестирования ?
Надо его тоже ввести

Для тестирования в Python в основном используют пакет pytest. Это простой, современный и гибкий фреймворк для написания и запуска тестов.

В вашем pyproject.toml его следует добавить в секцию [tool.poetry.dev-dependencies] (или просто установить, и Poetry добавит его сам):

pytest = "^7.4.0"

Или в терминале:

poetry add --dev pytest

Итого: модуль для тестирования — pytest.

Generated file

[project]
name = "annotation-proj"
version = "0.1.0"
description = "test annotation samples"
authors = [
{name = "Your Name",email = "you@example.com"}
]
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"black (>=25.1.0,<26.0.0)",
"flake8 (>=7.3.0,<8.0.0)",
"isort (>=6.0.1,<7.0.0)",
"mypy (>=1.16.1,<2.0.0)",
"pytest (>=8.4.1,<9.0.0)"
]


[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"


Do you confirm generation?
(yes/no) [yes]

Да, такой файл с разделом [project] и перечисленными зависимостями — корректный и рабочий для проекта на Python 3.12+ при использовании PEP 621 (современный стандарт pyproject.toml).

Ваш список зависимостей выглядит хорошо:

  • black, flake8, isort и mypy — статический анализ и форматирование.
  • pytest — для тестирования.

Вы можете подтвердить генерацию (ответить "yes") — всё нужное для старта здесь уже есть!

Если понадобится добавить ещё какие-то инструменты для тестирования (например, плагины, coverage), их так же можно добавить в этот список.
Если вдруг используете
poetry, зависимости обычно прописываются в [tool.poetry.dependencies] и [tool.poetry.dev-dependencies], но PEP 621-структура также поддерживается многими инструментами.

Ответ: подтверждаю, можно продолжать!

Все готово.Что делаем даоьше.
Мы пока по-моему не задействовали ни одно окружение.
Нам надо попасть в окрудение
poetry - оно где-то есть

Вы правы — пока мы не активировали виртуальное окружение, и не использовали poetry напрямую.

Если вы используете poetry, то шаги такие:

1.  Инициализируйте poetry-проект (если не сделали ранее):

poetry init

или, чтобы сразу создать pyproject.toml с вопросами от poetry:

poetry init

Если у вас уже есть pyproject.toml, этот шаг можно пропустить.

1.  Установите зависимости из pyproject.toml:

poetry install

Это создаст виртуальное окружение для проекта и установит туда все перечисленные зависимости (dev и prod).

1.  Активируйте окружение poetry:

Можно использовать команды poetry для работы в окружении:

  • Чтобы выполнить команду (например, запуск Python или shell) внутри окружения:

    poetry shell

После этого у вас будет приглашение оболочки, в которой все зависимости и пути настроены на нужное виртуальное окружение.

  • Либо всегда запускать команды через poetry, например:

    poetry run python main.py

    poetry run pytest

    poetry run mypy .

Проверьте, что окружение действительно активно (в приглашении командной строки обычно появляется название виртуального окружения, например, (myprojectname-XXXXX)).

Кратко:

1.  Выполните poetry install в корне проекта.

2.  Затем войдите в окружение через poetry shell.

Теперь вы можете разрабатывать, запускать тесты и анализировать код, будучи в нужном окружении.

Если что-то не получается — напишите текст ошибки!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry init
A pyproject.toml file with a project and/or a poetry section already exists.

Это сообщение значит, что файл pyproject.toml уже существует в директории вашего проекта (скорее всего, вы уже запускали poetry init, или создавали проект через poetry new).

Что делать дальше?

  • Если вы хотите продолжить работу над проектомне нужно снова запускать poetry init.
  • Для установки зависимостей (по списку в pyproject.toml) запустите:

poetry install

  • Чтобы зайти во внутреннюю командную строку окружения:

poetry shell

  • Для добавления новых зависимостей:

poetry add имя_пакета

  • Для запуска программы используйте:

poetry run python имя_вашего_скрипта.py

Совет:
Не запускайте
poetry init повторно для одного и того же проекта. Просто работайте с тем pyproject.toml, который уже есть.

Если нужно посмотреть или изменить настройки, откройте файл pyproject.toml в любом текстовом редакторе.

Если есть конкретные проблемы или ошибки — пришлите полный текст ошибки!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry install
Installing dependencies from lock file

No dependencies to install or update

Installing the current project: annotation-proj (0.1.0)
Error: The current project could not be installed: No file/folder found for package annotation-proj
If you do not want to install the current project use --no-root.
If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.
If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.

Ваша ошибка:

Error: The current project could not be installed: No file/folder found for package annotation-proj

означает, что Poetry не может найти исходные файлы для самого проекта. То есть не видит модуля или папки с кодом, который вы хотите собирать как пакет.

По умолчанию Poetry ожидает, что у вас есть папка с вашим проектом, например annotation_proj, в корне рядом с pyproject.toml. Эта папка должна содержать ваш основной код (например, __init__.py и другие модули).

Что делать:

1.  Убедитесь, что структура вашего проекта вот такая:

annotation_proj/

   pyproject.toml

   ...

└─ annotation_proj/

       __init__.py

       другие_файлы.py

То есть, у вас должна быть папка с именем вашего пакета (чаще всего совпадает с названием в pyproject.tomlname = "annotation-proj", но с подчеркиваниями вместо дефисов, т.е. annotation_proj).

1.  Если у вас пока только отдельные .py файлы (например, main.py), создайте такую папку:

  • В проекте (где лежит pyproject.toml) создайте папку annotation_proj
  • Переместите туда ваши файлы.
  • Добавьте пустой файл __init__.py

1.  Если ваш проект не задуман как библиотека, а вы просто хотите использовать Poetry для управления зависимостями (не сборки пакета):

  • Откройте pyproject.toml
  • В секции [tool.poetry] добавьте строку

  package-mode = false

  • Или используйте флаг:

  poetry install --no-root

Тогда Poetry не будет пытаться устанавливать локальный пакет.

Пример секции в pyproject.toml для библиотеки:

[tool.poetry]

name = "annotation-proj"

version = "0.1.0"

description = ""

authors = ["Your Name <you@example.com>"]

packages = [{ include = "annotation_proj" }]

Резюме:
Либо создайте подпапку с исходниками, чтобы Poetry видел пакет, либо используйте флаг
--no-root или настройку package-mode = false для проектов только с зависимостями.

Если нужна помощь — покажите структуру вашего проекта (что и где лежит) и сам pyproject.toml (можно без личных данных).

Мы хотим собирать все в пакет.
У нас будут отдельный независимые скрипты и тесты.
ПОка скриптов нет

Отлично, если вы хотите, чтобы проект собирался в pip-пакет (даже если сейчас там только модули и тесты, а скриптов-поинтов входа пока нет), лучше соблюдать следующую рекомендуемую структуру:

annotation-proj/

├── annotation_proj/          # Пакет с кодом (сюда складывать .py файлы библиотеки)

   └── __init__.py

├── tests/                    # Тесты (имя tests ― устоявшееся)

   └── test_something.py

├── pyproject.toml

└── README.md

В вашем pyproject.toml секция для poetry должна быть такой (если пакет называется annotation-proj, а исходники лежат в папке annotation_proj):

[tool.poetry]

name = "annotation-proj"

version = "0.1.0"

description = "Описание вашего пакета"

authors = ["Ваше Имя <you@example.com>"]

# Если подпапка отличается от имени пакета — явно укажите include

packages = [{ include = "annotation_proj" }]

В этом случае команда poetry install всегда будет работать корректно, как в dev-режиме, так и для сборки пакета.

Тесты и любые дополнительные скрипты держите за пределами папки с исходниками (их не надо включать в пакет; тесты обычно не кладут в пакет через Poetry — библиотечная часть не должна зависеть от тестов).

Когда захотите добавить настоящие исполняемые скрипты (CLI или инструменты для пользователей), реализуйте их в виде функций внутри библиотеки, а для публикации сделайте https://python-poetry.org/docs/pyproject/#scripts в pyproject.toml, вот так:

[tool.poetry.scripts]

mytool = "annotation_proj.cli:main"

где annotation_proj/cli.py содержит функцию main.

С такой структурой всё будет работать «канонично» и удобно для вас и пользователей пакета.

я сделал в папке scripts
hello_world.py:
print("Hello world")
Наишите простой тест для этого скрипта

Конечно! Для такого простого скрипта тест обычно проверяет вывод, который он печатает. Для этого можно использовать модуль subprocess и проверить, что скрипт действительно выводит "Hello world".

Вот пример теста, который можно положить, например, в tests/test_hello_world.py:

import subprocess

import sys

import os

 

def test_hello_world_script():

    script_path = os.path.join(os.path.dirname(__file__), '..', 'scripts', 'hello_world.py')

    result = subprocess.run([sys.executable, script_path], capture_output=True, text=True)

    assert result.stdout.strip() == "Hello world"

    assert result.returncode == 0

Этот тест выполнит скрипт как отдельный процесс и проверит его стандартный вывод.
Если используете
pytest, тест будет найден автоматически. Убедитесь, что структура папок такая:

project_root/

├── scripts/

   └── hello_world.py

└── tests/

    └── test_hello_world.py

Пояснения:

  • capture_output=True нужен для захвата вывода.
  • text=True делает вывод строкой, а не байтами.
  • strip() убирает лишние символы перевода строки.
  • Вы можете запускать тест командой pytest.

platform win32 -- Python 3.12.3, pytest-8.3.5, pluggy-1.5.0
rootdir: D:\VC25\Otus\Py\250610\projects\annotation_proj
configfile: pyproject.toml
plugins: anyio-4.9.0
collected 1 item

tests\test_hello_world.py .

Поздравляю, ваш тест прошёл успешно! Точка (.) в выводе pytest указывает на то, что тест был выполнен и завершился без ошибок. Это значит, что ваш скрипт hello_world.py корректно выводит "Hello world", и тестовый сценарий работает как надо.

Если у вас есть следующие шаги, например, добавить новые тесты или поручить другие проверки — просто дайте знать, с радостью помогу!

A как быть с Poetry init ?

Если вы работаете с новым проектом на Python и хотите управлять зависимостями с помощью Poetry, используйте команду:

poetry init

Эта команда запускает мастера, который шаг за шагом поможет создать pyproject.toml. В этом файле будут храниться все ваши зависимости, информация о проекте, параметры тестов и другое.

Когда мастер задаёт вопросы, вы можете соглашаться по умолчанию (жмите Enter), либо вручную вводить название и версии пакетов, которые хотите добавить. Например, для тестирования вы можете указать pytest как dev-зависимость.

После завершения инициализации запускайте:

poetry install

Эта команда установит все указанные зависимости в виртуальное окружение, автоматически созданное внутри Poetry. После этого вы можете запускать тесты как обычно:

poetry run pytest

Если у вас уже есть pyproject.toml, повторно выполнять poetry init не нужно. Просто добавляйте новые зависимости командой вроде:

poetry add имя_пакета

или для dev-зависимостей:

poetry add --dev pytest

Если будут вопросы по структуре проекта, интеграции Poetry с pytest или другим инструментам — спрашивайте!

Я ошибся
Как быть с
poetry install
?

Ничего страшного, бывает! Давайте разберёмся — что значит «как быть с poetry install»? Вот краткие пояснения, которые помогут в зависимости от ситуации:

Если вы уже инициализировали проект через poetry init или у вас есть файл pyproject.toml, то команда poetry install устанавливает все зависимости, перечисленные в этом файле, и создаёт/обновляет виртуальное окружение для проекта. Эту команду обычно используют после клонирования репозитория или изменения списка зависимостей.

Если вы ошибочно запустили poetry install в папке без pyproject.toml, то получите ошибку типа «Poetry could not find a pyproject.toml file». В таком случае сначала создайте этот файл командой poetry init или, если проект уже был, скопируйте файл откуда-нибудь.

Если вы ошиблись в составе зависимостей и уже использовали poetry install, просто используйте:

  • poetry add пакет — чтобы добавить,
  • poetry remove пакет — чтобы удалить не нужный пакет,
    а затем снова выполните
    poetry install (обычно это не требуется, так как add/remove автоматически обновляют окружение).

Итак, если вы не уверены или что-то пошло не так — устраните ошибку (исправьте зависимости, настройте pyproject.toml), а затем снова выполните poetry install. Это главная команда для приведения окружения в порядок согласно описанию вашего проекта.

Если под «ошибся» вы имели в виду что-то другое — уточните вопрос, я помогу подробнее!

Вы хотите сказать что в нашем случае poetry install не нужен.
У нас в .
toml - файле куча зависимостей для форматирования проекта.
?

poetry install нужен в вашем случае.

Если в вашем pyproject.toml указаны зависимости (например, для форматирования — black, isort, flake8 и т.д.), то чтобы их установить в виртуальное окружение, вы должны выполнить команду:

poetry install

Эта команда создаст виртуальное окружение (если его ещё нет) и установит все зависимости из вашего файла pyproject.toml (разделы [tool.poetry.dependencies] и [tool.poetry.dev-dependencies]). Это стандартный способ привести проект к состоянию, которое указано в конфигурации.

Резюме:
Если у вас в
.toml-файле прописаны зависимости (в том числе для форматирования), то обязательно используйте poetry install — без этого ничего не будет установлено, и инструменты для форматирования работать не будут.

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry install
Installing dependencies from lock file

No dependencies to install or update

Installing the current project: annotation-proj (0.1.0)
Error: The current project could not be installed: No file/folder found for package annotation-proj
If you do not want to install the current project use --no-root.
If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.
If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.
---------------------
[project]
name = "annotation-proj"
version = "0.1.0"
description = "test annotation samples"
authors = [
{name = "Your Name",email = "you@example.com"}
]
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"black (>=25.1.0,<26.0.0)",
"flake8 (>=7.3.0,<8.0.0)",
"isort (>=6.0.1,<7.0.0)",
"mypy (>=1.16.1,<2.0.0)",
"pytest (>=8.4.1,<9.0.0)"
]


[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"

По сообщению:

Error: The current project could not be installed: No file/folder found for package annotation-proj

If you do not want to install the current project use --no-root.

If you want to use Poetry only for dependency management but not for packaging, you can disable package mode by setting package-mode = false in your pyproject.toml file.       

If you did intend to install the current project, you may need to set `packages` in your pyproject.toml file.

Что происходит:
Poetry пытается установить текущий проект в режиме пакета, но не может найти исходные файлы (папку), которые оно должно собрать как Python-пакет. Это вызвано тем, что не указано, где находится исходный код, или структура проекта не соответствует ожиданиям Poetry.

Причины и решения

1. Нет исходной директории (например, папка с вашим модулем)

По умолчанию Poetry ищет папку с именем вашего проекта (например, annotation_proj или annotation-proj), в которой должен быть файл __init__.py. Если такой папки нет — возникает ошибка.

Решение:

  • Создайте директорию annotation_proj в корне проекта
  • Поместите туда хотя бы пустой файл __init__.py

annotation_proj/

  __init__.py

pyproject.toml

2. В pyproject.toml не указан путь к пакетам

Вы можете явно указать, где искать исходный код:

Добавьте в pyproject.toml секцию (https://python-poetry.org/docs/pyproject/#packages):

[tool.poetry]

name = "annotation-proj"

version = "0.1.0"

description = "test annotation samples"

authors = [

    {name = "Your Name",email = "you@example.com"}

]

readme = "README.md"

requires-python = ">=3.12"

 

[tool.poetry.dependencies]

black = ">=25.1.0,<26.0.0"

flake8 = ">=7.3.0,<8.0.0"

isort = ">=6.0.1,<7.0.0"

mypy = ">=1.16.1,<2.0.0"

pytest = ">=8.4.1,<9.0.0"

 

packages = [

    { include = "annotation_proj" }

]

 

[build-system]

requires = ["poetry-core>=2.0.0,<3.0.0"]

build-backend = "poetry.core.masonry.api"

3. Вы не хотите собирать пакет — только установить зависимости

Если у вас проект без кода (например, только для форматирования/линтинга), либо структура произвольная, вы можете отключить пакетный режим.

Вариант 1:
вызвать

poetry install --no-root

(то есть зависимости будут установлены, но сам проект как пакет — нет)

Вариант 2:
В
pyproject.toml добавить:

[tool.poetry]

package-mode = false

(или в секции [project], если вы придерживаетесь PEP 621, однако, в Poetry используется [tool.poetry]!)


РЕЗЮМЕ.

  • Если делаете пакет — создайте папку с кодом и придерживайтесь стандартной структуры.
  • Если просто нужны инструменты и нет кода — используйте poetry install --no-root или package-mode = false.
  • Для любых зависимостей Poetry требуется правильная структура или отключение сборки пакета.

Если вы покажете свою файловую структуру (tree или как выглядят папки/файлы в проекте), я подскажу, что добавить/переименовать, чтобы работало!

У нас не зависимо от проектов в Windows poetry уже установлен.
Возникает вопрос зачем мы при создании проекта еще раз делаем
install poetry.
Как найти место куда ( в какие папки ) установлен
poetry.
?

Отличный вопрос!

Poetry — это инструмент для работы с Python-проектами: установка его на компьютере происходит один раз (глобально), после чего вы используете его для управления разными проектами. Обычно Poetry не нуждается в отдельной установке для каждого проекта.


Почему не надо устанавливать Poetry для каждого проекта

Когда вы пишете команду вроде pip install poetry или используете официальный способ установки (install-poetry.py), Poetry устанавливается один раз на вашу систему (глобально или в профиль пользователя). После этого для создания проектов и управления зависимостями во всех ваших папках вы просто вызываете команду poetry ... из любой директории.

Повторно ставить Poetry в каждом проекте нет необходимости — вы используете ранее установленный исполнительный файл, который уже добавлен в ваш PATH.


Где найти установленный Poetry

1. Быстрый способ:
Откройте командную строку и запустите:

where poetry

или

poetry --version

Команда where poetry покажет путь к исполняемому файлу poetry, который сейчас используется в системе.

2. Стандартные пути установки:

  • Если устанавливали через https://python-poetry.org/docs/#installation:
    по умолчанию для пользователя —
    C:\Users\<ВашеИмя>\AppData\Roaming\Python\Scripts\poetry.exe
    или
    C:\Users\<ВашеИмя>\.local\bin\poetry.exe (реже)
  • Если ставили через pip глобально (не рекомендуют, но бывает):
    C:\Python39\Scripts\poetry.exe и т.п.

Как проверить, что Poetry уже установлен

В обычном терминале:

poetry --version

Если ответ — например, Poetry (version 1.7.1), значит, уже стоит.


Диагностика пути

Чтобы узнать, какой именно poetry запускается:

where poetry

или (для PowerShell):

Get-Command poetry

В результате вы увидите абсолютный путь к poetry.exe.


Итог

  • Один раз установили Poetry — используете во всех проектах.
  • В каждом проекте ставить Poetry необязательно (и смысла нет).
  • Путь к текущей установке можно узнать через where poetry.
  • Обычно находится в C:\Users\<ваш_пользователь>\AppData\Roaming\Python\Scripts, если ставили на пользователя.

Если хотите, напишите результат команды where poetry — помогу интерпретировать!

PS D:\VC25\Otus\Py\250530\projects\my_poetry_project> where poetry
PS D:\VC25\Otus\Py\250530\projects\my_poetry_project> poetry --version
Poetry (version 2.1.3)
Как найти где находиться poetry ?

Если команда where poetry не выдает путь, но poetry --version работает — значит, PowerShell не находит файл напрямую в известных ему путях, но Poetry запускается как alias, shim или через какой-то другой механизм (например, был установлен через pipx, или через Microsoft Store).

Попробуйте следующие команды:

1.  Для PowerShell:

   Get-Command poetry

В выводе будет строка типа:

   CommandType     Name                                               Version    Source

   -----------     ----                                               -------    ------

   Application     poetry.exe                                         0.0.0.0    C:\Users\USERNAME\AppData\Roaming\Python\Scripts\poetry.exe

1.  Через Python:
Если
poetry был установлен через pip:

   python -m site --user-base

Обычно Poetry оказывается в папке:

   <путь_выше>\Scripts\poetry.exe

То есть, если выдаст:
C:\Users\USERNAME\AppData\Roaming\Python,
значит сами исполняемые файлы — в
C:\Users\USERNAME\AppData\Roaming\Python\Scripts.

1.  Через pipx (если устанавливали через pipx):

   pipx list

Найдите там строчку с poetry, обычно путь будет примерно:
C:\Users\USERNAME\.local\pipx\venvs\poetry\Scripts\poetry.exe


Подытожим:

  • Попробуйте Get-Command poetry — быстрый способ выяснить путь.
  • Если не сработает — уточните, как устанавливали Poetry, помогу найти по этому признаку.

Напишите, что выдаст Get-Command poetry!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> Get-Command poetry

CommandType Name Version Source
----------- ---- ------- ------
Application poetry.exe 0.0.0.0 C:\Users\Administrator\AppData\Roaming\Python\Scripts\poetry.exe

Отлично! Вывод говорит о следующем:

Путь к poetry.exe:

C:\Users\Administrator\AppData\Roaming\Python\Scripts\poetry.exe

Если хотите узнать только путь в PowerShell для дальнейшего использования, выполните:

(Get-Command poetry).Source

Это выведет строчку:

C:\Users\Administrator\AppData\Roaming\Python\Scripts\poetry.exe

Если будут ещё вопросы по работе с Poetry или средой — пишите!

Вернемся к нашему проекту - Значит не нужно ничего делать больше.
В файле .
toml зависимости указаны.
Как узнать , что эти зависимости работают, а не лежат пустым грузом ?
[project]
name = "annotation-proj"
version = "0.1.0"
description = "test annotation samples"
authors = [
{name = "Your Name",email = "you@example.com"}
]
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"black (>=25.1.0,<26.0.0)",
"flake8 (>=7.3.0,<8.0.0)",
"isort (>=6.0.1,<7.0.0)",
"mypy (>=1.16.1,<2.0.0)",
"pytest (>=8.4.1,<9.0.0)"
]


[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"

Ваш вопрос очень хороший: как удостовериться, что зависимости действительно установлены и работают, а не просто прописаны в pyproject.toml?

Когда зависимости добавлены в [project] pyproject.toml, сам факт их присутствия в этом файле ещё не гарантирует, что они установлены в вашей текущей среде.

Проверьте, что зависимости реально установлены:

Обычно для Poetry это делается командой:

poetry install

Эта команда читает pyproject.toml и устанавливает все указанные пакеты в виртуальное окружение проекта.

Проверить, работают ли они (установлены ли):

Выполните:

poetry show

Эта команда выведет список реально установленных зависимостей внутри poetry-окружения для вашего проекта.

Для каждой зависимости вы увидите строку с ее версией. Например, если у вас в списке flake8 — он будет отображён вместе с версией, если установлен.

Пояснение:
Если вы видите свои зависимости в выводе
poetry show (или poetry show --tree, чтобы увидеть цепочки зависимостей), они действительно установлены и готовы к использованию.

Если некоторые зависимости отсутствуют в этом списке, значит, они не были установлены (возможно, вы не запускали poetry install после правки pyproject.toml).


Итого:
Указание зависимостей в
pyproject.toml — всего лишь шаг для описания требований. Для их установки используйте poetry install, а для проверки — команду poetry show.

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> poetry show
black 25.1.0 The uncompromising code formatter.
click 8.2.1 Composable command line interface toolkit
colorama 0.4.6 Cross-platform colored terminal text.
flake8 7.3.0 the modular source code checker: pep8 pyflakes and co
iniconfig 2.1.0 brain-dead simple config-ini parsing
isort 6.0.1 A Python utility / library to sort Python imports.
mccabe 0.7.0 McCabe checker, plugin for flake8
mypy 1.16.1 Optional static typing for Python
mypy-extensions 1.1.0 Type system extensions for programs checked with the mypy type checker.
packaging 25.0 Core utilities for Python packages
pathspec 0.12.1 Utility library for gitignore style pattern matching of file paths.
platformdirs 4.3.8 A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.
pluggy 1.6.0 plugin and hook calling mechanisms for python
pycodestyle 2.14.0 Python style guide checker
pyflakes 3.4.0 passive checker of Python programs
pygments 2.19.2 Pygments is a syntax highlighting package written in Python.
pytest 8.4.1 pytest: simple powerful testing with Python
typing-extensions 4.14.0 Backported and Experimental Type Hints for Python 3.9+
PS D:\VC25\Otus\Py\250610\projects\annotation_proj>

Ваш вывод poetry show означает, что в изолированной среде проекта действительно установлены следующие зависимости:

  • black
  • click
  • colorama
  • flake8
  • iniconfig
  • isort
  • mccabe
  • mypy
  • mypy-extensions
  • packaging
  • pathspec
  • platformdirs
  • pluggy
  • pycodestyle
  • pyflakes
  • pygments
  • pytest
  • typing-extensions

Вывод:
Все перечисленные библиотеки реально установлены и готовы к использованию в вашем проекте. Это включает как ваши прямые зависимости (например,
flake8, pytest, mypy, black), так и их зависимости (например, pycodestyle, mccabe).

Если нужной зависимости нет в этом списке:

  • Проверьте, добавили ли вы её в [tool.poetry.dependencies] или [tool.poetry.dev-dependencies] в pyproject.toml.
  • Если добавили — выполните poetry install для загрузки.
  • После этого она появится в списке poetry show.

Таким образом
Команда
poetry show показывает только то, что реально установлено в среде проекта. Всё из списка (в ваших выводах) — установлено и доступно для импорта в Python в рамках этого проекта.
Если нужно проверить, почему не установилась какая-то библиотека, напишите её название — помогу разобраться!

А как Вы узнали, что перечень этих зависимостей -
Это имеено те зависимости, которые лежат в проекте.
Может это общие зависимости независимы от конкретного проекта.
Где это видно, что это наши зависимости.
Зависимости нашего проекта *

Отличный вопрос! Вот как это работает:

Команда poetry show показывает зависимости ТОЛЬКО для текущего проекта, в каталоге которого вы находитесь. Она берёт информацию из poetry.lock (или из виртуального окружения проекта, если файл lock отсутствует) — этот файл автоматически появляется после poetry install или poetry add. Там фиксируются все версии и список библиотек, необходимых именно для этого проекта с учётом всех вложенных зависимостей.

Это не глобальные зависимости системы Python и не "общие" библиотеки — только то, что установлено через Poetry внутри вашего проекта.

Если вы запустите poetry show в другом каталоге с другим проектом, то увидите другой список — зависимости будут специфичны для того проекта, где вы сейчас находитесь.

Т.е. вывод poetry show — это "наш" список, потому что:

  • Он формируется только из зависимостей, установленных для текущего проекта Poetry.
  • Он НЕ показывает пакеты из глобального окружения Python.
  • Он основывается на poetry.lock и pyproject.toml текущей директории.

Проверьте: попробуйте создать новую папку, выполнить там poetry init (или даже просто) poetry install — и посмотрите на результат вывода в новом проекте. Список будет совершенно другим (или пустым, если не прописывать зависимости).

Где это видно напрямую?
Всё, что установлено через
Poetry, появляется в директории .venv вашего проекта и фиксируется в poetry.lock. Оба эти файла (или папка) находятся внутри каталога проекта — это дополнительное подтверждение, что речь только о вашем проекте.

Резюме:
poetry show показывает только зависимости вашего текущего проекта, а не глобальные или чужие библиотеки.

Если нужны доказательства или объяснения по структуре файлов и команд — спрашивайте!

Вот теперь понятно.
То есть
poetry ищет зависмости в том месте, откуда его запускают.

Да, всё верно! Poetry работает в контексте текущей папки — там, где выполняется команда. Он ищет pyproject.toml (главный файл с зависимостями) именно в этой директории и работает с виртуальным окружением, которое относится к этому проекту. Поэтому все действия (установка, обновление, просмотр зависимостей) происходят только внутри вашего проекта и никак не влияют на другие проекты или системные библиотеки.

Если запустить Poetry в другой папке без pyproject.toml, он не будет знать, что это за проект, и либо выдаст ошибку, либо предложит создать новый проект.

Необычное поведение. Не правда ли ?
Обычно мы устанавливаем в опреденный каталог и ищем их в этом одном каталоге.
А
Poetry ищет зависимости в любом месте где они есть. Заглядывает в разные места.
Патерн
Visitor c++

Интересное наблюдение! На самом деле, поведение Poetry обусловлено принципами разработки современных Python-проектов и best practice — всё хранится локально вокруг проекта: зависимости, настройки, виртуальное окружение. Благодаря этому проекты изолированы друг от друга, и зависимости не конфликтуют. Это стандартный подход для инструментов управления зависимостями, таких как Poetry, pipenv, npm (для JS).

По поводу того, что Poetry “ищет зависимости в любом месте где они есть” — не совсем так: он ищет их только относительно вашего текущего рабочего каталога, вверх по структуре каталогов. То есть, если вы запускаете команду, он ищет в текущей папке, а если не нашел, поднимается выше — но только до корневой директории или до первого найденного pyproject.toml.

Это немного похоже на паттерн Visitor, но больше напоминает стандарт поиска конфигурации вверх по дереву директорий (например, как git ищет свой .git каталог).

Именно такой шаблон поиска позволяет запускать команды из подпапок проекта, не обязательно из корня, — и Poetry всё равно “поймет”, к какому проекту вы относитесь.

В целом, у этого подхода есть логика: он делает управление зависимостями модульным и безопасным. Но для новичков поначалу это действительно может показаться неожиданным!

Это у нас скрипт
from typing import Anydef foo(x: Any): """⬆️ Change me. No need to implement the function."""

надо написать тестЧтобы были такие результатыfoo(1) - okfoo("10") - okfoo(1,2) #expect_type error.

Задача ясна?Это мы отгадываем какая аннотация вызовет такие результаты тестов.foo(1,2) #expect_type error. false = Ok

Да, задача ясна! Нужно отгадать аннотацию параметров функции foo, чтобы:

  • foo(1) — ОК
  • foo("10") — ОК
  • foo(1, 2)ошибка типа (то есть нельзя передать два аргумента)

Единственная аннотация, дающая такое поведение — это когда функция принимает один аргумент произвольного типа (а не кортеж, не список и т.п.).

То есть:

from typing import Any

 

def foo(x: Any):

    """⬆️ Change me. No need to implement the function."""

Значит, менять ничего не надо!
Уже сейчас сигнатура
foo(x: Any) означает, что функция принимает ровно один аргумент (любого типа), а вызов с двумя аргументами вызовет ошибку:

foo(1)    # ok

foo("10") # ok

foo(1, 2) # TypeError: foo() takes 1 positional argument but 2 were given

Вывод:
Правильная аннотация —
foo(x: Any).
Сигнатура уже правильная!

Если же у вас где-то стоит задача именно о type hint-ах, которые не дают такого поведения (и например, допускают больше одного аргумента), напишите уточнение. Но на основе ваших формулировок — всё уже верно.

Это надо подтвердить написанием тестов.
Это наше предположение
from typing import Any
def foo(x: Any):

Пишем три теста
Первый тест выдает
true if foo(1) is true
Второй тест выдает
true if foo("10") is true
Третий тест выдает
true if foo(1, 2) is false

Вот как можно реализовать три теста для функции foo с учетом вашего предположения и требований:

from typing import Any

 

def foo(x: Any):

    return True

 

# Тест 1: foo(1) — результат должен быть True

try:

    result1 = foo(1) is True

except Exception:

    result1 = False

 

# Тест 2: foo("10") — результат должен быть True

try:

    result2 = foo("10") is True

except Exception:

    result2 = False

 

# Тест 3: foo(1, 2) — должна быть ошибка, тест считается успешным, если ошибка возникла

try:

    foo(1, 2)

    result3 = False  # Если ошибки не было — тест не пройден

except TypeError:

    result3 = True   # Если была ошибка — тест пройден

except Exception:

    result3 = False  # Неожиданные исключения — тест не пройден

 

print(result1, result2, result3)

Если запускать этот код, то результат будет:

True True True

Этим мы подтверждаем, что функция принимает ровно один аргумент любого типа и не работает при двух аргументах.

Но в семантику реальных тестов же можно это обернуть.
Представте, что Вы пишите обычные тесты

Вы абсолютно правы: реальные тесты обычно оформляются с помощью специальных фреймворков — например, unittest или pytest. В них тесты выражают через методы, а проверки пишут через специальный синтаксис (assert или assert* методы). Пример на pytest для вашей функции, которая должна принимать ровно один аргумент любого типа и возвращать True, а также кидать ошибку при попытке передать два аргумента:

import pytest

 

def foo(x):

    return True

 

def test_foo_with_int():

    assert foo(1) is True

 

def test_foo_with_str():

    assert foo("10") is True

 

def test_foo_with_two_args():

    with pytest.raises(TypeError):

        foo(1, 2)

Если вы используете стандартный unittest:

import unittest

 

def foo(x):

    return True

 

class FooTests(unittest.TestCase):

 

    def test_with_int(self):

        self.assertTrue(foo(1) is True)

 

    def test_with_str(self):

        self.assertTrue(foo("10") is True)

 

    def test_with_two_args(self):

        with self.assertRaises(TypeError):

            foo(1, 2)

 

if __name__ == "__main__":

    unittest.main()

Видите: семантика тестов становится привычной и прозрачной, ошибки ясно фиксируются, и читается всё очень профессионально — как реальный нормальный проектный тест-кейс.

Что считается сейчас более современным
- вариант с
pytest
- вариант с
unittest
?

Сейчас более современным и популярным вариантом среди Python‑разработчиков считается использование pytest.

Pytest максимально прост в использовании, лаконичен, поддерживает огромное количество плагинов и дополнительных возможностей (фикстуры, параметризацию, простую интеграцию с другими инструментами). Он позволяет писать тесты без лишней «обязательной» обёртки (классы, наследование), как в unittest. Большинство современных open-source проектов и фреймворков по умолчанию используют именно pytest.

Unittest — это стандартная библиотека, которая была первой, базируется на подходе тестирования из Java (JUnit), и всё ещё широко поддерживается, особенно в корпоративном секторе, где любят стандартные решения. Но сейчас он воспринимается скорее как «надежная классика», а не cutting-edge.

Итого: для большинства новых проектов и современных best practice выбирают pytest.

Как запустить тесты в папке tests ?

Чтобы запустить тесты, расположенные в папке tests, используйте в командной строке следующую команду:

pytest tests

Эта команда запустит все тесты (файлы, начинающиеся обычно на test_ или заканчивающиеся на _test.py) во всей вложенной структуре папки tests. Убедитесь, что вы находитесь в корне проекта и что pytest установлен (pip install pytest, если не установлен).

Результаты выполнения появятся прямо в терминале.

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> pytest tests
============================================================================ test session starts =============================================================================
platform win32 -- Python 3.12.3, pytest-8.3.5, pluggy-1.5.0
rootdir: D:\VC25\Otus\Py\250610\projects\annotation_proj
configfile: pyproject.toml
plugins: anyio-4.9.0
collected 4 items

tests\test_basic_any.py ...
[ 75%]
tests\test_hello_world.py .

Ну как моя идея обернуть отгадывание в
test - семантику ?

Ваша идея обернуть процесс «отгадывания» (например, интерактивную логику или игру) в структуру теста вполне интересна, но требует осмысленного подхода. Тесты, особенно в экосистеме pytest, обычно предназначены для автоматического запуска без необходимости ручного ввода данных или внешних взаимодействий.

Плюсы такого подхода:

  • Позволяет формализовать и запротоколировать ожидаемое поведение «отгадывания».
  • Проверяет корректность алгоритма без запуска основной программы.

Минусы:

  • Простое оборачивание интерактивного сценария (например, с input()) не сработает: тест должен быть автоматизирован.
  • Если в «отгадывании» есть случайность или ввод пользователя, придется делать моки (подмены) для этих мест.

Как обычно это решают?
Пишут функцию, выполняющую всю логику отгадывания на основе заранее известных данных («загаданное число», «ответы пользователя»), а сам тест вызывает эту функцию с наборами параметров и проверяет ожидаемый результат.
Пример (псевдокод):

def guess_game(secret, guesses):

    # returns True, если угадали за отведенные попытки

    ...

 

def test_guess_success():

    assert guess_game(5, [1, 3, 5]) is True

 

def test_guess_fail():

    assert guess_game(7, [1, 2, 3]) is False

Таким образом, интерактивная логика отделяется, и тесты становятся полностью автоматическими.

Вывод:
Обернуть отгадывание в тест — хорошая идея, если логика вынесена в функции и не зависит от ручного взаимодействия, случайности или внешних эффектов. Тогда тесты будут воспроизводимыми и полезными для поддержки и развития кода.

Я в начале хотел саму задачу в скрипт выносить
А потом уже в тесте делать
import этого скрипта и сам тест.
Так более правильно, но долго.
Как считаетеб может быфть так лучше сделать.
Чтобы сразу чистые правильные ответы смотреть в скриптах, а не в те
cтах
?

Ваш подход вполне рационален и вообще стандартен — основную логику (функции/классы) лучше выносить в отдельный скрипт или модуль, а тесты держать отдельно, делая import нужной логики. Это называются чистая архитектура и модульность.

Так проще поддерживать код и писать тесты. Скрипты содержат только логику, тесты — только проверки. Вы видите чистые правильные ответы в тестах, а не в самом скрипте — и это как раз верно! В реальных проектах именно так и делают: вся логика — в src/, тесты — в tests/.

Скрипт (модуль, например, game.py) содержит только реализацию:

def guess_game(secret, guesses):

    ...

А файл тестов (test_game.py):

from game import guess_game

 

def test_guess():

    assert guess_game(5, [1,2,5])

Тесты всегда проверяют, что ваш код работает как надо, а правильные ответы прописываются только в тестах, это и есть их смысл. Если хочется "быстро увидеть правильные ответы" — можно для отладки временно вызывать функцию с нужными параметрами прямо в скрипте. Но финальный вариант для чистоты лучше делать как выше: логика отдельно, тесты отдельно.

Вывод:
Вы делаете правильно! Это чуть дольше в начале, но потом сильно облегчает изменение кода, добавление новых тестов и поиск ошибок. Именно так строится профессиональная разработка.

И с точки зрения Загадки правильная последовательность.
Мы открываем скрипт и пытаемся отгадать загадку и не видим ответов.
А в тестах у нас отгадки спрятаны до поры до времени

Абсолютно верно! Такой подход — это своего рода «честная игра»: в самом скрипте у вас загадка и механизм проверки, и человек может самостоятельно пробовать отгадывать, не видя ответов заранее. А в тестах (которые обычный пользователь не запускает) лежат «отгадки» — то есть правильные ответы, которые нужны только для автоматической проверки самого кода. Получается, логика загадки остаётся чистой, её действительно можно «решить», а тесты хранятся отдельно и используются для контроля качества.

Так делают во всех задачах на олимпиадах, платформах вроде LeetCode или Яндекс.Контест, когда решение проверяется на скрытых примерах. Один и тот же принцип: загадка открыта, решение предлагается пользователем, а тесты — для проверки, и ответы «прячутся» там до проверки. Это и есть хорошая практика профессиональной разработки, так называемое разделение ответственности — код отдельно, тесты отдельно.

Давайте так и сделаем.
Вот у нас код теста.
import pytest
import subprocess
import sys
import os

def foo(x):
return True

def test_foo_with_int():
assert foo(1) is True

def test_foo_with_str():
assert foo("10") is True

def test_foo_with_two_args():
with pytest.raises(TypeError):
foo(1, 2)
------
Разделите его на скрипт.py и test c import script

Конечно! Вот как разделить ваш код на два файла: script.py и test_script.py.

script.py
(Сюда помещается только ваша функция)

def foo(x):

    return True


test_script.py
(Тесты импортируют функцию из вашего скрипта и запускаются через
pytest)

import pytest

from script import foo

 

def test_foo_with_int():

    assert foo(1) is True

 

def test_foo_with_str():

    assert foo("10") is True

 

def test_foo_with_two_args():

    with pytest.raises(TypeError):

        foo(1, 2)


Теперь тесты (test_script.py) используют функцию из основного скрипта (script.py).
Для запуска тестов используйте команду:

pytest test_script.py

Убедитесь, что оба файла лежат в одной папке.

У меня scripts лежат в папке srs
А тесты в папке
tests
Исправте код скрипта и теста с учетом папок

Конечно! Давайте организуем структуру проекта так, как у вас:

project_root/

├── srs/

   └── script.py

└── tests/

    └── test_script.py

srs/script.py

def foo(x):

    return True

tests/test_script.py

import sys

import os

 

# Добавляем папку srs в sys.path, чтобы импортировать script

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'srs')))

 

from script import foo

import pytest

 

def test_foo_with_int():

    assert foo(1) is True

 

def test_foo_with_str():

    assert foo("10") is True

 

def test_foo_with_two_args():

    with pytest.raises(TypeError):

        foo(1, 2)

Такой импорт работает без необходимости создавать пакетную структуру srs (без __init__.py), если вы запускаете pytest из корня проекта:

pytest tests/

Если хотите сделать проект чуть «чище», можно добавить файл __init__.py в папку srs и тогда в тестах просто сделать:

from srs.script import foo

Тогда не понадобится трюк с sys.path.

Второй вариант действительно лучше и чище
с _
init__.py

Совершенно верно! Если добавить файл __init__.py в директорию srs, она станет полноценным Python-пакетом. Тогда весь импорт можно строить правильно и удобно, например:

from srs.script import foo

и никаких манипуляций с sys.path делать больше не потребуется. Pytest и другие инструменты будут корректно видеть и подтягивать модули. Такой подход облегчает сопровождение кода, избегает конфликтов имён и ошибок импорта.

Если потребуется пример структуры проекта, вот минимальный вариант:

project_root/

├── srs/

   ├── __init__.py

   └── script.py

└── tests/

    └── test_script.py

Теперь можно запускать тесты из корня:

pytest

и всё будет работать прозрачно и "по-питоновски".

# tests.test_basic_any.py
import sys
import os

from src.basic_any import foo
import pytest

def test_foo_with_int():
assert foo(1) is True

def test_foo_with_str():
assert foo("10") is True

def test_foo_with_two_args():
with pytest.raises(TypeError):
foo(1, 2)
----------------------------------
src.basic_any.py
----------------------------------
from typing import Any
def foo(x: Any):
pass

Выдает ошибку
ImportError while importing test module 'D:\VC25\Otus\Py\250610\projects\annotation_proj\tests\test_basic_any.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
D:\Tools\Anaconda\Lib\importlib\__init__.py:90: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
tests\test_basic_any.py:4: in <module>
from src.basic_any import foo
E ModuleNotFoundError: No module named 'src'

У вас ошибка импорта: ModuleNotFoundError: No module named 'src'.
Это классическая проблема структуры проекта и путей импорта в Python.

Почему так происходит

Python ищет пакеты начиная с директории, из которой запущен скрипт или команда pytest. Если вы запускаете команду из каталога, где нет папки src, Python не знает где её искать.


Как исправить

1. Правильная структура проекта:

project_root/

├── src/

   ├── __init__.py

   └── basic_any.py

└── tests/

    └── test_basic_any.py

Примечание: наличие пустого __init__.py внутри папки src рекомендовано, чтобы Python воспринимал её как пакет.


2. Из корня проекта выполняйте:

pytest

( Из той же папки, где лежит папка src, а не изнутри папки tests! )


3. Если возникнут проблемы с путём — используйте переменную окружения

pytest --maxfail=1 --disable-warnings --tb=short

или:

python -m pytest

(также из корня проекта)


4. Не используйте sys.path/абсолютные пути — только относительные импорты от корня.


Краткий план действий

1.  Убедитесь, что src и tests лежат рядом в одном каталоге.

2.  В src обязательно должен быть __init__.py.

3.  Запускайте всё из корня проекта, а не из папки tests.


Если нужно проверить, что структура верная:

annotation_proj/

├── src/

   ├── __init__.py

   └── basic_any.py

└── tests/

    └── test_basic_any.py


Кратко:

Запускай pytest из той папки, где лежит папка src!
Тогда
from src.basic_any import foo будет работать корректно.

Если ещё есть вопросы — напиши свою структуру проекта (вывод tree), и я помогу точнее!

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> cd src
PS D:\VC25\Otus\Py\250610\projects\annotation_proj\src> pytest
============================================================================ test session starts =============================================================================
platform win32 -- Python 3.12.3, pytest-8.3.5, pluggy-1.5.0
rootdir: D:\VC25\Otus\Py\250610\projects\annotation_proj
configfile: pyproject.toml
plugins: anyio-4.9.0
collected 0 items

Ты запустил pytest внутри папки src, из-за этого тесты не найдены, потому что они лежат в соседней папке tests. Pytest ищет тестовые файлы только в текущей директории и её подпапках. Поэтому — нужно запускать pytest из корня, где лежит и src, и tests!

Как правильно:

Из директории annotation_proj (то есть на шаг выше):

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> pytest

Тогда pytest увидит папку tests и найдёт твои тестовые файлы.


Если тесты всё равно не находятся —напиши вывод tree из корня проекта и покажи пример имён файлов тестов.

PS D:\VC25\Otus\Py\250610\projects\annotation_proj> pytest
============================================================================ test session starts =============================================================================
platform win32 -- Python 3.12.3, pytest-8.3.5, pluggy-1.5.0
rootdir: D:\VC25\Otus\Py\250610\projects\annotation_proj
configfile: pyproject.toml
plugins: anyio-4.9.0
collected 4 items / 1 error

=================================================================================== ERRORS ===================================================================================
__________________________________________________________________ ERROR collecting tests/test_basic_any.py __________________________________________________________________
ImportError while importing test module 'D:\VC25\Otus\Py\250610\projects\annotation_proj\tests\test_basic_any.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
D:\Tools\Anaconda\Lib\importlib\__init__.py:90: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
tests\test_basic_any.py:4: in <module>
from src.basic_any import foo
E ModuleNotFoundError: No module named 'src'
========================================================================== short test summary info ===========================================================================
ERROR tests/test_basic_any.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted
: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Спасибо за подробное описание и вывод ошибки. Сейчас самая распространённая проблема —pytest не видит модуль src при импорте из файла tests/test_basic_any.py.


Причина:

Python не знает, где искать твой локальный пакет src, потому что текущая папка (annotation_proj) не добавлена в переменную окружения PYTHONPATH по умолчанию.


Решения

1. Запускать через python -m pytest

Этот способ чаще всего решает проблему:

python -m pytest

Это добавляет текущий каталог в sys.path, и импорты from src... начинают работать.


2. Добавить к PYTHONPATH твою рабочую папку

Перед запуском тестов установить переменную окружения:

$env:PYTHONPATH="D:\VC25\Otus\Py\250610\projects\annotation_proj"

pytest

(В PowerShell так. В cmd вместо $env:VAR=val будет set VAR=val && pytest.)


3. (Опционально) Добавить пустой файл __init__.py в папку src

Так папка станет валидным Python-пакетом для импорта:

/annotation_proj/

  /src/

    __init__.py

    basic_any.py


4. (Важное замечание): НЕ менять импорты в тестах

Правильная строчка импорта в тесте:

from src.basic_any import foo


Если ни один способ не помог — пришли структуру проекта (tree /F или скрин) и содержимое теста (test_basic_any.py).

src/basic_any.py
from typing import Any
def foo(x: Any):
pass

Ваш файл src/basic_any.py выглядит корректно для минимального примера.

Чтобы всё импортировалось в тестах, используйте одну из моделей запуска:


1. Добавьте PYTHONPATH

Перед запуском теста, находясь в корне проекта (annotation_proj), выполните в командной строке**:

CMD:

set PYTHONPATH=%CD%\src && pytest

или

PowerShell:

$env:PYTHONPATH="$pwd\src"; pytest


2. Добавьте пустой файл __init__.py в папку src

Создайте пустой файл src/__init__.py (важно!), чтобы src воспринималась как пакет.


3. Как должен выглядеть импорт в тесте

В вашем тесте пишите:

from basic_any import foo

если запускаете с параметром PYTHONPATH=src,
или

from src.basic_any import foo

если src ― подпакет в структуре выше (и PYTHONPATH не используете).


ВАЖНО:
Если вы запускаете тест внутри папки
src, импорт будет просто

from basic_any import foo

Если из корня проекта — как выше сказано.


Проверьте структуру:

annotation_proj/

|-- src/

    |-- __init__.py

    |-- basic_any.py

|-- tests/

    |-- test_basic_any.py

и запускайте тесты из папки annotation_proj:

cd D:\VC25\Otus\Py\250610\projects\annotation_proj

set PYTHONPATH=%CD%\src && pytest


Если опять не работает — пришлите путь до теста и его содержимое.
Буду рад дословно помочь!

В каталоге src образовался файл _pycache_

По умолчанию, Python создает папку __pycache__ внутри каталогов, где есть импортируемые модули (.py-файлы). В этой папке хранятся скомпилированные байткод-файлы (.pyc), чтобы ускорять запуск и импорт модулей.

Это абсолютно нормально и не мешает работе проекта. __pycache__ можно:

  • Игнорировать: ничего делать не нужно, пусть остается.
  • Добавить в файл .gitignore, чтобы не попадал в вашу систему контроля версий (если используете git):

·         __pycache__/

  • Удалять вручную, но он появится снова при запуске импортов модулей.

Обычно файл __pycache__ просто оставляют и не трогают — это стандартная часть работы Python. Удалять не обязательно и не вредно.

Если у вас по поводу этой папки какой-то специфический вопрос — уточните, пожалуйста, детали!

Следующий sample
import sys
import os
from typing import Dict
import pytest

def foo(x: Dict[str, str]):
pass

# Тесты для foo
def test_foo_with_valid_dict():
assert foo({"foo": "bar"}) is None

def test_foo_with_invalid_value():
with pytest.raises(TypeError):
foo({"foo": 1}) # expect-type-error

Исключение - это правильное поведение - исключение надо превратиь в правильное поведение программы, чтобы прошли тесты

Ваша функция foo ожидает словарь с ключами и значениями типа str, но сама функция никак не проверяет типы значений, а аннотация типов не навязывает строгую проверку во время выполнения. Из-за этого вызов foo({"foo": 1}) не приводит к исключению TypeError — функция ничего не делает, просто возвращает None.

Чтобы тесты проходили, функцию foo нужно изменить так, чтобы она явно выбрасывала TypeError, если значения словаря не строки. Например, так:

def foo(x: Dict[str, str]):

    for key, value in x.items():

        if not isinstance(value, str):

            raise TypeError(f"Value for key {key} is not str")

    # остальная логика (если будет нужна)

Теперь тесты пройдут, потому что:

  • при foo({"foo": 1}) выбросится TypeError,
  • при foo({"foo": "bar"}) функция вернёт None и не упадёт.

Если что-то ещё — уточняйте.

def foo(x: dict[str, str]):
pass
##
End of your code ##
foo({"foo": "bar"})
foo({"foo": 1}) # expect-type-error
Посмотрите - это правильный ответ
Сходиться с нашим ?

 


Комментариев нет:

Отправить комментарий