Атрибуты класса в объектах Python «стирают» сами себя

#python-3.x #oop #printing #attributes

#python-3.x #ооп #печать #атрибуты

Вопрос:

Я работаю с некоторым старым кодом Python2 из конкурса differential power analysis (DPA), прошедшего давным-давно (http://www.dpacontest.org/home/index.html). Код, который я изменяю, можно найти здесь (https://svn.comelec.enst.fr/dpacontest/code/reference /)

Текущая проблема, которая сводит меня с ума: по сути, некоторые объекты Python в этом коде «сотрут» сами себя или вернутся к своим значениям по умолчанию, и я понятия не имею, почему. Я не могу найти какой-либо код в логическом потоке, который делает это, и я не думаю, что это проблема области видимости.

Я пытался переписать части кода, чтобы использовать numpy вместо отображения лямбда-функций. Я также перепробовал множество различных порядков кода и извлечения методов из их классов и попыток запустить их локально / встроенно.

main.py:

 loc_subkeys = brk.get_subkeys()
  

des_breaker.py

 def get_subkeys(self):
    """
    Returns a vector of currently best sboxes subkeys.
    This is an array of 8 integers.
    """
    sk = np.array([])
    for i in range(8):
        sk = np.append(sk, self.__sbox_breakers[i].get_key())
    return sk
  

sbox_breaker.py

 def get_key(self):
    "Gives the current best key"
    if self.__best_key is None:
        marks = np.array([])
        print("p0: ", len(list(self.__key_estimators[0]._key_estimator__p0)))
        print("p1: ", len(list(self.__key_estimators[0]._key_estimator__p1)))
        print("p0: ", len(list(self.__key_estimators[0]._key_estimator__p0)))
        print("p1: ", len(list(self.__key_estimators[0]._key_estimator__p1)))
        for i in range(64):
            ke = self.__key_estimators[i]
            marks = np.append(marks, ke.get_mark())
            self.__best_key = np.argmax(marks)
        return self.__best_key
  

key_estimator.py — атрибуты

 class key_estimator:
    """
    Provides methods to give a mark to the key relatively to the probability f
    the correctness of the key.
    """
    __sbox = None
    __key = None
    __cnt0 = 0    # The accumulated traces count in partition 0
    __cnt1 = 0    # The accumulated traces count in partition 1
    __p0 = None  # The bit=0 estimated partition
    __p1 = None  # The bit=1 estimated partition
    __diff = np.array([])  # The differential trace
  

Инструкции печати в sbox_breaker принадлежат мне. Их вывод — единственная подсказка, которая у меня есть прямо сейчас:

p0: 5003 (Хорошо)

p1: 5003 (Хорошо)

p0: 0 (???)

p1: 0

Что дает? Во второй раз атрибуты класса key_estimator, похоже, стерлись сами. Это происходит со всеми атрибутами, а не только с p0 и p1.

Первый цикл в этой программе работает, но на второй итерации (начиная с main) он завершается неудачей, потому что атрибуты стерлись сами. Я могу «стереть» их вручную, просто напечатав атрибуты объекта.

Комментарии:

1. можете ли вы предоставить логин htaccess для ссылки на код, который вы предоставляете

2. Да, извините, это на веб-странице. Пользователь: гость, передача: гость. Также я думаю, что я разобрался со своей проблемой. Проблема заключается в отображении Python2 -> Python3 map. Атрибуты — это карты, которые, похоже, не сохраняются, поэтому превращение их в списки устранило проблему для меня.

Ответ №1:

Итак, я, похоже, устранил проблему после сна. Атрибуты класса создавались с помощью map, которая возвращает список в Python2, но не в Python3. Превращение их в списки с помощью list() решает проблему сохранения. Я не мог бы сказать вам, почему печать атрибута карты приводит к его самоочищению.

Комментарии:

1. Поскольку карты являются ленивыми итераторами, они выполняются за один проход