Что делает обратные галочки значат для интерпретатора Python: 'цифра'

Вот то, что мы делаем.

  1. Приложения называют с номером версии Схемы. appa_2, appb_1, и т.д.

  2. Незначительные изменения не изменяют число.

  3. Существенные изменения увеличивают число. Работы 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 ...
    

Дело в том, что отбрасывание и воссоздает, является не всегда соответствующим. Иногда полезно переместиться, данные формируют старую модель к новой модели, не восстанавливая с нуля.

81
задан lesmana 28 November 2011 в 19:38
поделиться

3 ответа

Обратные кавычки являются устаревшим псевдонимом для 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.

118
ответ дан 24 November 2019 в 09:40
поделиться

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.

9
ответ дан 24 November 2019 в 09:40
поделиться

Я предполагаю, что num не определяет метод __ str __ () , поэтому str () должен делать второй поиск для __ repr __ .

Обратные кавычки ищут напрямую __ repr __ . Если это правда, то использование repr () вместо обратных кавычек должно дать те же результаты.

1
ответ дан 24 November 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: