Порядок исполнения кода - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в программировании.Может ли кто-нибудь помочь мне понять порядок выполнения сценария?У меня есть код:

import unittest

var = 'one'

class FirstTest(unittest.TestCase):
    def test_one(self):
        self.assertEqual(var, 'one')

# del var

if __name__ == '__main__':
  unittest.main()

Прежде всего мне нужно проверить мою переменную "var = 'one'".И тогда я должен удалить эту переменную (Del Var).Без удаления var (del var) тест проходит.Но если я удаляю эту переменную из области видимости, тест нарушается, даже если я помещаю тест перед выполнением del var .Я получаю следующую ошибку:

NameError: name 'var' is not defined

Либо организация моего кода неприемлема, либо я не понимаю порядок выполнения скрипта и когда участвуют тесты.Итак, где я могу найти любую информацию, чтобы решить мою проблему - пройти тест, а затем удалить мой ценный var?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Код в функциях (и, соответственно, в методах) не выполняется до тех пор, пока вы их не вызовете. Имена в функциях только , затем разыменовываются.

Имя var является глобальным и ищется каждый раз, когда вы ссылаетесь на него. Если бы Python этого не сделал, вы бы никогда не смогли использовать глобальные переменные как переменные, вы не смогли бы изменить их значение во время выполнения вашей программы.

Это unittest.main() вызов в конце вашего скрипта , который (в конце концов) вызывает метод test_one(), поэтому var должен существовать до как минимум , который точка.

В явном виде:

  • объявление функции с def только инициирует создание объекта функции, а затем присваивает этому объекту новое имя (имя после ключевого слова def). Вам нужно вызвать функцию для запуска кода внутри нее.

  • Оператор class очень похож на объявление функции, но тело класса выполняется немедленно, чтобы сформировать атрибуты класса. Итак, class FirstTest(...): ... выполняется, и у вас появляется новый объект класса с именем FirstTest в вашем глобальном пространстве имен. Это включает в себя выполнение объявления def test_one(): внутри, поэтому test_one является атрибутом класса FirstTest. Код внутри самого test_one по-прежнему не выполняется.

Это означает, что в вашем скрипте происходит:

  • import unittest выполнено; имя unittest добавлено в ваши глобалы
  • var = 'one' выполнено, имя var добавлено к вашим глобальным переменным
  • class FirstTest выполнено, имя FirstTest добавлено в ваши глобалы
    • При выполнении тела класса имя test_one добавляется в пространство имен класса, поэтому у класса есть атрибут test_one.
  • Опционально: del var выполняется, имя var равно удалено из глобалов.
  • Выполнен тест if. Если true, выражение unittest.main() выполняется. unittest является существующим глобальным, найден атрибут main и вызван объект, на который ссылается unittest.main.
  • unittest.main() выполняет код, который находит все тестовые случаи в текущем модуле, здесь FirstTest. Для каждого атрибута в FirstTest, который начинается с test_, выполняется тестовый запуск, который вызывает этот атрибут. Здесь test_one найдено и выполнено.
    • self.assertEqual(var, 'one') выполнено
      • self - допустимое локальное имя, ссылающееся на экземпляр теста
      • Найден атрибут assertEqual, разрешающий объект
      • имя var ищется. Это глобально, так что лучше существовать!
0 голосов
/ 15 мая 2018

Сначала будут прочитаны самые внешние области видимости (строки без отступов), то есть сверху вниз, если вы определите var, определите класс, который использует var, а затем удалите var к моменту создания экземпляра класса (предположительно вваш основной блок) var больше не доступен.

Я не уверен, почему вам нужно удалить var, но если это необходимо сделать, то, вероятно, лучше всего это сделать после отступа unittest.main() в том же блоке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...