Skip to content
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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

kiri11
Copy link
Contributor

@kiri11 kiri11 commented Jan 5, 2023

Финальная задачка Спринт 5: Удали узел не проходит по этому шаблону через 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

И они как раз были добавлены недавно.

Видимо класс Node определяется уже после кода студента, поэтому он ещё не доступен на этой строчке.

Предлагаю добавить строчку from __future__ import annotations или добавить кавычки к Optional['Node']. Оба эти варианта работают. Я выбрал кавычки. IDE нормально работают с типизацией классами в кавычках, распознают их именно как классы.

Также думаю, что для упрощения можно вообще не делать переключатель LOCAL, так как класс Node всё равно переопределится при запуске через Make, и это работает.

Также код приведен к PEP8: snake_case переменных и правильное количество пропущенных строк.

Финальная задачка [Спринт 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 переменных и правильное количество пропущенных строк.
@Romanchenko Romanchenko self-requested a review January 22, 2023 23:29
from typing import Optional

LOCAL = True
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет! Предлагаю это менять иначе -- вынести объявление ноды в отдельный модуль и подключать его везде при тестировании на сервере. Я бы не хотела, чтобы объявление ноды из студенческого кода прорастало в проверку, так как это открывает большую дорогу для поломок, хаков и всего остального. Я сделаю фикс для этого. За обнаружение проблемы спасибо, но пр мержить не будем

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Так уже и есть. Объявление ноды при проверке подключается ПОСЛЕ кода студента, и оно перезапишет тот класс, который есть у студента, так что хаков не будет. ПР только для упрощения жизни студента, чтобы ему не надо было делать бесполезную работу, переключая LOCAL туда-сюда. На самом деле это ни на что не влияет.

Copy link
Collaborator

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/

В какой-то момент я захочу добавить в каждую ноду секрет или еще какое значение, и жизнь станет сложнее для редактирования задачи. Короче я прям хочу, чтоб использовалось объявление класса из кода, который не доступен студенту)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants