我知道您可以使用__get__
和__set__
方法为类实例定义数据描述符。可以为导入的模块定义类似的东西吗?
用例:
我有一个很大的测试文件,在其中定义了很多字典
test_data.py
(旧版代码),因此所有这些变量都是**可变的,如果不使用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
的副本
答案 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}