我想知道Python是否具有类似C#匿名类功能的东西。为了澄清,这是一个示例C#代码段:
var foo = new { x = 1, y = 2 };
var bar = new { y = 2, x = 1 };
foo.Equals(bar); // "true"
在Python中,我会想象这样的事情:
foo = record(x = 1, y = 2)
bar = record(y = 2, x = 1)
foo == bar # true
特定要求是能够在表达式上下文中创建具有指定字段的对象(例如,可在lambda和不允许使用语句的其他地方使用),而无需其他外部声明,并且能够通过普通成员按名称访问各个组件访问语法foo.bar。创建的对象还应按组件名称 (而不是像元组那样按位置)实现结构比较。
特别是:元组不是因为它们的组件没有命名;类不是因为它们需要声明;dict是不是因为它们具有不希望使用的foo["bar"]语法来访问组件。
namedtuple是不是,因为即使您内联定义类型,它仍然需要一个名称,并且比较是基于位置的,而不是基于名称的。特别是:
def foo(): return namedtuple("Foo", "x y")(x = 1, y = 2)
def bar(): return namedtuple("Foo", "y x")(x = 1, y = 2)
foo() == bar() # False because fields are compared in order, and not by name
# True would be desired instead
我知道如何在需要时用Python编写这样的东西。但是我想知道Python标准库或任何流行的第三方库中是否有类似的东西。
[编辑]
仅出于此目的,这是一个单表达式解决方案,它结合了Ken和alanlcode的两个非常有用的答案,从而产生了结构相等性而没有任何额外的外部声明:
type("", (), { \
"__init__": (lambda self, **kwargs: self.__dict__.update(kwargs)), \
"__eq__": (lambda self, other: self.__dict__ == other.__dict__) } \
)(x = 1, y = 2)
从技术上讲,它可以满足问题的所有要求,但我衷心希望没有人会使用它(我绝对不会)。
