Действительно ли процесс соления детерминирован?

Да, Chrome может:)

  1. Откройте «Инструменты разработчика» (Ctrl + Shift + I) / из меню гаечного ключа / или щелкните правой кнопкой мыши страницу и нажмите «Проверить элемент»
  2. Перейдите на вкладку «Хронология».
  3. Нажмите маленькую кнопку «Запись» внизу.
  4. Обновите страницу.

Он покажет вам все события загрузки (желтым цветом), а также события AJAX, которые происходят, когда вы наводите курсор мыши и т. Д.

Приветствия;)

8
задан Alex Morega 12 June 2009 в 06:41
поделиться

2 ответа

Я полагаю возможна ошибка при обработке словарей с одинаковым содержимым, но с разными историями вставки / удаления.

Справа:

>>> pickle.dumps({1: 0, 9: 0}) == pickle.dumps({9: 0, 1: 0})
False

См. также: pickle.dumps, не подходящие для хеширования

Моя цель - создать «подпись» аргументов функции с использованием Pickle и SHA1 для реализации memoize.

С этим возникает ряд фундаментальных проблем. Это' Невозможно придумать преобразование объекта в строку, которое правильно отображает равенство - подумайте о проблеме идентичности объекта:

>>> a = object()
>>> b = object()
>>> a == b
False
>>> pickle.dumps(b) == pickle.dumps(a)
True

В зависимости от ваших точных требований вы можете преобразовать иерархии объектов в те, которые затем можно было бы хэшировать. :

def hashablize(obj):
    """Convert a container hierarchy into one that can be hashed.

    Don't use this with recursive structures!
    Also, this won't be useful if you pass dictionaries with
    keys that don't have a total order.
    Actually, maybe you're best off not using this function at all."""
    try:
        hash(obj)
    except TypeError:
        if isinstance(obj, dict):
            return tuple((k, hashablize(v)) for (k, v) in sorted(obj.iteritems()))
        elif hasattr(obj, '__iter__'):
            return tuple(hashablize(o) for o in obj)
        else:
            raise TypeError("Can't hashablize object of type %r" % type(obj))
    else:
        return obj
8
ответ дан 5 December 2019 в 20:18
поделиться

Что вы подразумеваете под одним и тем же выводом? Обычно вы всегда должны получать один и тот же результат для обхода (травление -> распаковка), но я не думаю, что сам сериализованный формат гарантированно будет одинаковым во всех условиях. Конечно, это может меняться между платформами и всем остальным.

За один запуск вашей программы, использование травления для мемоизации должно быть нормальным - я без проблем использовал эту схему несколько раз, но это было для довольно простых задач. Одна из проблем заключается в том, что это не охватывает все полезные случаи (на ум приходит функция: их нельзя мариновать, поэтому, если ваша функция принимает вызываемый аргумент, это не сработает).

0
ответ дан 5 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

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