python模块的数据描述符

时间:2018-12-13 11:58:07

标签: python dictionary immutability

我知道您可以使用__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 :(得分:1)

由于需要将描述符定义为类属性,因此不能直接做到这一点(这意味着您必须将其添加到内置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)

答案 1 :(得分:0)

我认为您的意思是字典是可变的,并且您想要在测试用例中更改字典而不修改原始字典。

您确实可以使用Deepcopy,这根本不是一个坏习惯。您还可以更改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}