Дескрипторы данных для модуля Python - PullRequest
0 голосов
/ 13 декабря 2018

Я знаю, что вы можете определить дескрипторы данных для экземпляра класса, используя методы __get__ и __set__.Можно ли определить нечто подобное для импортированного модуля?

Вариант использования:

У меня большой тестовый файл с большим количеством словарей, определенных в test_data.py (устаревший код), поэтомувсе они ** изменчивы и не могут быть изменены отдельными тестами без использования deepcopy

Я хочу иметь возможность изменять эти словари

  1. Без перезаписи данных вклассы
  2. без вызова Deepcopy в тестах.

Тестовые данные:

expected_response_1 = dict(status=False)

Тестовый набор:

from test import test_data

data = test_data.expected_response_1
data['status'] = True

print(data)
# --> {'status': True}

print(test_data.expected_response_1)
# --> {'status': False}

Есть ли *я могу использовать python-magic, чтобы всегда возвращать копию expected_response_1

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Это нельзя сделать напрямую, поскольку дескрипторы должны быть определены как атрибуты класса (что означает, что вам нужно добавить их к встроенному типу module, что недопустимо).

НО вы можетепросто используйте простую обертку вокруг вашего test_data модуля и используйте магический метод __getattr__():

class DataWrapper(object):
    def __init__(self, module):
        self._module = module

    def __getattr__(self, name):
        val = getattr(self._module, name)
        return copy.deepcopy(val)


from test import test_data
test_data = WrapperData(test_data)
0 голосов
/ 13 декабря 2018

Я думаю, что вы имеете в виду, что словари являются изменяемыми, и вы хотите изменить словари в тестовом примере без изменения исходного словаря.

Вы действительно можете использовать глубокую копию, что вовсе не является плохой практикой.Вы также можете изменить модуль test_data для предоставления словарей в качестве свойств класса: каждый раз будет возвращаться новый словарь с исходным содержимым:

test_data.py:

class test_data:

    @property
    @staticmethod
    def expected_response_1:
        return dict(status=False)

test_case.py:

from test.test_data import test_data

data = test_data.expected_response_1
data['status'] = True

print(data)
# --> {'status': True}

print(test_data.expected_response_1)
# --> {'status': False}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...