出于测试目的,我需要创建类似于具有某些特定字段的空对象。让我通过例子澄清:
目前有一个结构:
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
操作的函数。
答案 0 :(得分:1)
class TestData(object):
def __init__(self, **dict):
self.__dict__.update(dict)
var = {
'blas': {
'bla': 0.250,
'bla1': 0.300,
'bla2': 6,
},
'somth1': 2,
'something': [
{ 'h1': 66.00 },
{ 'h2': 47.00 },
{ 'h3': 85.00 },
{ 'h4': 32.00 },
{ 'h5': 34.00 }
],
'this_has_to_be_object': TestData(field=1)
}
所以:
>>> var['this_has_to_be_object'].field
1
答案 1 :(得分:1)
Namedtuples正在进行中,如果它们不必变得可变:
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
请注意,yourobject现在有您尝试访问的任何字段或方法,它们的值都是另一个MagicMock实例。它是一个非常强大的单元测试工具。
最后你可以创建一个无聊的虚拟类:
class Dummy(object):
pass
yourobject = Dummy()
yourobject.field = 3
答案 2 :(得分: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'}
}
这已经是一个对象,如果你说you want to add some field inside
你可以像
...this_has_to_be_object.newField = 3;
这不是你想要的吗?
答案 3 :(得分:1)
为什么不使用默认字典 here.e.g。
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 ['anything']总是以0返回。
我想这是测试所需的功能,对吗?