Python отделяет правое выражение от назначения левой стороны. Сначала оценивается правая часть, и результат сохраняется в стеке, а затем имена левой стороны назначаются с использованием кодов операций, которые снова принимают значения из в стек.
Для назначений кортежей с 2 или 3 элементами Python просто использует стек напрямую:
>>> import dis
>>> def foo(a, b):
... a, b = b, a
...
>>> dis.dis(foo)
2 0 LOAD_FAST 1 (b)
3 LOAD_FAST 0 (a)
6 ROT_TWO
7 STORE_FAST 0 (a)
10 STORE_FAST 1 (b)
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
После двух LOAD_FAST
опкодов (которые выталкивают значение из переменной на стек), верхняя часть стека содержит [a, b]
. Код операции ROT_TWO
заменяет верхние две позиции в стеке, поэтому стек теперь имеет [b, a]
вверху. Два STORE_FAST
opcodes затем берут эти два значения и сохраняют их в именах в левой части присваивания. Первый STORE_FAST
выводит значение вершины стека и помещает его в a
, затем снова появляется вспять, сохраняя значение в b
. Вращение необходимо, потому что Python гарантирует, что назначения в целевом списке с левой стороны выполняются слева направо.
Для назначения 3-имени, ROT_THREE
а затем ROT_TWO
выполняется, чтобы отменить три верхних элемента в стеке.
Для более длинных назначений слева строит явный кортеж:
>>> def bar(a, b, c, d):
... d, c, b, a = a, b, c, d
...
>>> dis.dis(bar)
2 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 LOAD_FAST 2 (c)
9 LOAD_FAST 3 (d)
12 BUILD_TUPLE 4
15 UNPACK_SEQUENCE 4
18 STORE_FAST 3 (d)
21 STORE_FAST 2 (c)
24 STORE_FAST 1 (b)
27 STORE_FAST 0 (a)
30 LOAD_CONST 0 (None)
33 RETURN_VALUE
Здесь стек с [d, c, b, a]
используется для сборки кортежа (в обратном порядке снова появляется BUILD_TUPLE
из стека, нажимая полученный кортеж в стек), а затем UNPACK_SEQUENCE
снова выталкивает кортеж из стека, снова выталкивает все элементы из кортежа обратно в стек для операций STORE_FAST
.
Последний может показаться расточительной операцией, но правильный - сторона стороны присваивания может быть чем-то совершенно другим, вызов функции, который создает кортеж, возможно, поэтому интерпретатор Python не делает предположений и всегда использует код операции UNPACK_SEQUENCE
. Он делает это даже для операций назначения двух и трех имен, , но более поздняя (оптимизация) шаг оптимизации заменяет комбинацию BUILD_TUPLE
/ UNPACK_SEQUENCE
с 2 или 3 аргументами с указанным выше ROT_TWO
и ROT_THREE
для эффективности.
Вот некоторые примеры:
Это может или не может быть тем, что Вы после, но Библиотека MS Enterprise имеет полный набор модульных тестов (NUnit) как часть распределения исходного кода, я рассматривал бы это как довольно реальный мир.
Kev
TDD является процессом, который главным образом происходит промежуточный, соглашается на репозиторий.
При рассмотрении проектов с открытым исходным кодом Вы будете только видеть снимки кода, которые взяты, когда разработчик фиксирует.
Не должно быть никакого практического различия между фиксациями, сделанными разработчиком, который делает хороший дизайн и реализует много модульных тестов и хорошего разработчика это методы TDD. Различие - то, что процесс TDD оказывает давление на разработчике для создания чистой разработки и реализации большим количеством модульных тестов.
Рассмотрение проекта с открытым исходным кодом, на Котором делают пробную поездку, только позволит Вам видеть результат процесса TDD, не, как на Делать пробную поездку самим.
Для реального изучения этого действительно необходимо наблюдать, что кто-то делает TDD. Книга может помочь, но трудно показать процесс в книге. Намного лучше видеть сделанный в режиме реального времени. Лучший способ был бы к парной программе с кем-то, на ком делают пробную поездку. Следующей лучшей была бы живая демонстрация на конференции или собирающийся - возможно, у Вас есть группа локального пользователя?
При сбое этого существуют некоторые демонстрационные видео онлайн. Вот два:
Если Вы изучаете это для персонального использования TDD, я не думаю, просматривая другие проекты, действительно поможет Вам. Вместо этого необходимо погрузиться в и просто сделать это и учиться, когда Вы идете.
Для начала работы проверьте эта статья о тестировании и как начать, и эта книга о TDD Kent Beck (очень простой, легкий понять и проницательный).
Я не прошел через все вебкасты сам, таким образом, я не могу засвидетельствовать о том, как хорошо Rob Conery реализовал TDD, но его , серия MVC Storefront, как предполагается, использует TDD.
У Ron Jeffries есть много хороших статей о xprogramming.com . Если Вы делаете C#, ищете "Приключения в C#". Или купите книгу.
Его стиль записи покрывает большинство аспектов выполнения TDD, даже неправильные обороты, которые мы предназначены для взятия. Я изучил много его статей за эти годы, даже статей на более экзотических языках.
Приблизительно неделю назад Переговоры IT отправили очень интересный доклад, сделанный Kent Beck, который сфокусировался на TDD (но также и затронул шаблоны и экстремальное программирование). Ничто 'мясистое' до подробных инструкций относительно TDD, но информативный так или иначе. Определенно стоящий слушания, если Вы увеличиваете свои навыки TDD.