-
Notifications
You must be signed in to change notification settings - Fork 466
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Avoid NameError when LOCAL=False #12
base: main
Are you sure you want to change the base?
Conversation
Финальная задачка [Спринт 5: Удали узел](https://contest.yandex.ru/contest/24810/problems/B/) не проходит по этому шаблону через Make. В шаблоне написано: # ! change LOCAL to False before submitting ! # set LOCAL to True for local testing Но по факту всё наоборот: когда LOCAL= True, то тесты проходят, а когда False, то нет. Ошибка на той строчке, где типы: ``` def remove(root, key) -> Optional[Node]: NameError: name 'Node' is not defined ``` И они как раз были добавлены недавно. Yandex-Practicum@9f74a84 Видимо класс Node определяется уже после кода студента, поэтому он ещё не доступен на этой строчке. Предлагаю добавить строчку `from __future__ import annotations` или добавить кавычки к `Optional['Node']`. Оба эти варианта работают. Я выбрал кавычки. Также думаю, что для упрощения можно вообще не делать переключатель LOCAL, так как класс Node всё равно переопределится при запуске через Make, и это работает. Также код приведен к PEP8: snake_case переменных и правильное количество пропущенных строк.
from typing import Optional | ||
|
||
LOCAL = True |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Привет! Предлагаю это менять иначе -- вынести объявление ноды в отдельный модуль и подключать его везде при тестировании на сервере. Я бы не хотела, чтобы объявление ноды из студенческого кода прорастало в проверку, так как это открывает большую дорогу для поломок, хаков и всего остального. Я сделаю фикс для этого. За обнаружение проблемы спасибо, но пр мержить не будем
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Так уже и есть. Объявление ноды при проверке подключается ПОСЛЕ кода студента, и оно перезапишет тот класс, который есть у студента, так что хаков не будет. ПР только для упрощения жизни студента, чтобы ему не надо было делать бесполезную работу, переключая LOCAL туда-сюда. На самом деле это ни на что не влияет.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
я поменяла сейчас с отдельным импортом ноды, все заработало, можешь глянуть https://contest.yandex.ru/contest/24810/run-report/81197781/
В какой-то момент я захочу добавить в каждую ноду секрет или еще какое значение, и жизнь станет сложнее для редактирования задачи. Короче я прям хочу, чтоб использовалось объявление класса из кода, который не доступен студенту)
Финальная задачка Спринт 5: Удали узел не проходит по этому шаблону через Make.
В шаблоне написано:
Но по факту всё наоборот: когда
LOCAL= True
, то тесты проходят, а когдаFalse
, то нет.Ошибка на той строчке, где типы:
И они как раз были добавлены недавно.
Видимо класс
Node
определяется уже после кода студента, поэтому он ещё не доступен на этой строчке.Предлагаю добавить строчку
from __future__ import annotations
или добавить кавычки кOptional['Node']
. Оба эти варианта работают. Я выбрал кавычки. IDE нормально работают с типизацией классами в кавычках, распознают их именно как классы.Также думаю, что для упрощения можно вообще не делать переключатель LOCAL, так как класс Node всё равно переопределится при запуске через Make, и это работает.
Также код приведен к PEP8: snake_case переменных и правильное количество пропущенных строк.