如何创建带有指定字段的“空”对象
为了测试,我需要创建一个类似于空对象的东西,并且里面有一些特定的字段。让我通过一个例子来说明:
目前有一个结构:
var = {
'blas': {
'bla': 0.250,
'bla1': 0.300,
'bla2': 6,
...
},
'somth1': self.smth1,
'something': [
{ 'h1': 66.00 },
{ 'h2': 47.00 },
{ 'h3': 85.00 },
{ 'h4': 32.00 },
{ 'h5': 34.00 }
],
'this_has_to_be_object'.field: 1
}
我想要的是让 'this_has_to_be_object'
变成一个真正的对象,这样我就可以往里面添加一些字段并设置值。这样做的目的是为了测试另一个函数,这个函数会使用 'this_has_to_be_object'.field
。
3 个回答
1
为什么这里不使用一个默认字典呢?比如说:
var = defaultdict(int)
var.update({
'blas': {
'bla': 0.250,
'bla1': 0.300,
'bla2': 6,
...
},
'somth1': self.smth1,
'something': [
{ 'h1': 66.00 },
{ 'h2': 47.00 },
{ 'h3': 85.00 },
{ 'h4': 32.00 },
{ 'h5': 34.00 }
],
'this_has_to_be_object'.field: 1
}
)
这样的话,var['任何东西']总是会返回0。
我想这正是你在测试中需要的功能,对吧?
1
var = {
'blas': {
'bla': 0.250,
'bla1': 0.300,
'bla2': 6,
...
},
'somth1': self.smth1,
'something': [
{ 'h1': 66.00 },
{ 'h2': 47.00 },
{ 'h3': 85.00 },
{ 'h4': 32.00 },
{ 'h5': 34.00 }
],
'this_has_to_be_object':{'field': '1'}
}
这已经是一个对象了,如果你说你想在里面添加一些字段
,你可以这样做:
...this_has_to_be_object.newField = 3;
这不是你想要的吗?
1
命名元组是一种选择,如果它们不需要被修改的话:
from collections import namedtuple
MyTupleType = namedtuple('MyTupleType', ['field'])
yourobject = MyTupleType(field=3)
print(yourobject.field) # prints 3
如果是为了测试,那么使用 Mock 库也很方便(可以查看 http://www.voidspace.org.uk/python/mock/;unittest.mock
从 Python 3.3 开始就已经是标准库的一部分了)。
yourobject = MagicMock()
yourobject.field = 3
注意,你的对象现在有了你尝试访问的 任何 字段或方法,而且它们的值都是另一个 MagicMock 实例。这是一个非常强大的单元测试工具。
最后,你也可以简单地创建一个无聊的虚拟类:
class Dummy(object):
pass
yourobject = Dummy()
yourobject.field = 3