Вот то, что мы делаем.
Приложения называют с номером версии Схемы. appa_2
, appb_1
, и т.д.
Незначительные изменения не изменяют число.
Существенные изменения увеличивают число. Работы Syncdb. И сценарий "миграции данных" может быть записан.
def migrate_appa_2_to_3():
for a in appa_2.SomeThing.objects.all():
appa_3.AnotherThing.create( a.this, a.that )
appa_3.NewThing.create( a.another, a.yetAnother )
for b in ...
Дело в том, что отбрасывание и воссоздает, является не всегда соответствующим. Иногда полезно переместиться, данные формируют старую модель к новой модели, не восстанавливая с нуля.
Обратные кавычки являются устаревшим псевдонимом для repr ()
. Больше не используйте их, синтаксис был удален в Python 3.0.
Использование обратных кавычек кажется быстрее, чем использование repr (num)
или num .__ repr __ ()
в версия 2.x. Я предполагаю, что это связано с тем, что требуется дополнительный поиск в словаре в глобальном пространстве имен (для repr
) или в пространстве имен объекта (для __ repr __
) соответственно.
Использование Модуль dis
подтверждает мое предположение:
def f1(a):
return repr(a)
def f2(a):
return a.__repr__()
def f3(a):
return `a`
Дизассемблирование показывает:
>>> import dis
>>> dis.dis(f1)
3 0 LOAD_GLOBAL 0 (repr)
3 LOAD_FAST 0 (a)
6 CALL_FUNCTION 1
9 RETURN_VALUE
>>> dis.dis(f2)
6 0 LOAD_FAST 0 (a)
3 LOAD_ATTR 0 (__repr__)
6 CALL_FUNCTION 0
9 RETURN_VALUE
>>> dis.dis(f3)
9 0 LOAD_FAST 0 (a)
3 UNARY_CONVERT
4 RETURN_VALUE
f1
включает глобальный поиск для repr
, f2
поиск атрибута для __ repr __
, тогда как оператор обратного апострофа реализован в отдельном коде операции. Поскольку нет накладных расходов ни на поиск в словаре ( LOAD_GLOBAL
/ LOAD_ATTR
), ни на вызовы функций ( CALL_FUNCTION
), обратные кавычки выполняются быстрее.
Я думаю, что Ребята из Python решили, что наличие отдельной низкоуровневой операции для repr ()
не стоит того, а наличие как repr ()
, так и обратных кавычек нарушает принцип
«Должно быть один - и желательно только один - очевидный способ сделать это »
, поэтому эта функция была удалена в Python 3.0.
Backtick quoting is generally non-useful and gone in Python 3.
For what it's worth, this:
''.join(map(repr, xrange(10000000)))
is marginally faster than the backtick version for me. But worrying about this is probably a premature optimisation.
Я предполагаю, что num
не определяет метод __ str __ ()
, поэтому str ()
должен делать второй поиск для __ repr __
.
Обратные кавычки ищут напрямую __ repr __
. Если это правда, то использование repr ()
вместо обратных кавычек должно дать те же результаты.