我正在调试一些Python,它接受一个对象列表作为输入,每个对象都有一些属性.
我想硬编码一些测试值 - 比方说,一个四个对象的列表,其"foo"属性设置为某个数字.
有比这更简洁的方法吗?
x1.foo = 1 x2.foo = 2 x3.foo = 3 x4.foo = 4 myfunc([x1, x2, x3, x4])
理想情况下,我只想说出类似的话:
myfunc([, , , ])
(显然,这是伪造的语法.但是有类似的东西真的有效吗?)
注意:这将永远不会被签入.它只是一些一次性的调试代码.所以不要担心可读性或可维护性.
我喜欢Tetha的解决方案,但它不必要地复杂.
这里更简单:
>>> class MicroMock(object): ... def __init__(self, **kwargs): ... self.__dict__.update(kwargs) ... >>> def print_foo(x): ... print x.foo ... >>> print_foo(MicroMock(foo=3)) 3
我发现了这个:http://www.hydrogen18.com/blog/python-anonymous-objects.html,在我的有限测试中它似乎有效:
>>> obj = type('',(object,),{"foo": 1})() >>> obj.foo 1
看看这个:
class MiniMock(object): def __new__(cls, **attrs): result = object.__new__(cls) result.__dict__ = attrs return result def print_foo(x): print x.foo print_foo(MiniMock(foo=3))
如此简短,这样的Python!吴
>>> Object = lambda **kwargs: type("Object", (), kwargs)
然后你可以Object
用作通用对象构造函数:
>>> person = Object(name = "Bernhard", gender = "male", age = 42) >>> person.name 'Bernhard' >>>
编辑:好吧,从技术上讲,这会创建一个类对象,而不是一个对象对象.但是您可以将其视为匿名对象,或者通过附加一对括号来立即创建实例来修改第一行:
>>> Object = lambda **kwargs: type("Object", (), kwargs)()
另一个明显的hack:
class foo1: x=3; y='y' class foo2: y=5; x=6 print(foo1.x, foo2.y)
但是对于您的确切用例,直接调用带有匿名对象的函数,我不知道有哪一种细节比
myfunc(type('', (object,), {'foo': 3},), type('', (object,), {'foo': 4}))
丑陋,能胜任,但并非如此。