Python Dataclass给我“函数”对象没有属性“ __mro__”吗?

时间:2019-02-07 15:07:48

标签: python anaconda python-dataclasses

与上一个问题TypeError: 'int' object is not iterable while no iteration exists?一样,我在程序中发现问题。那是: 在Python中,

  • set( (0,0) )实际上给了您{0},但我想要{(0,0)}
  • collections.deque( ((0, 0), [ (0, 0) ] ) ).popleft()实际上给了您(0,0),而我想要((0, 0), [ (0, 0) ] )

所以现在,我正在考虑设计自己的数据类。但是在测试代码中,我遇到了一个“函数”对象,没有属性“ mro ”的问题。

测试代码1

from dataclasses import dataclass
@dataclass
def DequeItems():
    current:tuple
    path:list

a=DequeItems(current=(0, 0),\
        path=[ (0, 0) ] )
print(a)

测试代码1错误屏幕截图

enter image description here

测试代码2

from dataclasses import dataclass

@dataclass(init=True)
def Pair():
    visit:tuple

a=Pair( visit=(0,0)) 
print(a)   

测试代码2错误scrrenshot enter image description here

我的Python版本是Anaconda 3.6.8

1 个答案:

答案 0 :(得分:1)

set的参数必须是可迭代的,并且其元素是所需的设置项。 set( (0,0) )有一个可迭代的参数,但是其元素是0和0,而不是元组(0,0)。您需要set([(0,0)])deque也是如此;您需要一个可迭代的包含元组((0, 0), [ (0, 0) ] ),所以

collections.deque([((0, 0), [ (0, 0) ] )])

至于您看到的错误,function没有__mro__,因为它不需要一个。它的基类始终为object,并且您不能从function继承来创建其MRO需要访问function的假定MRO的类。

关于为什么的数据类会引发该错误,这是因为dataclass装饰器必须装饰,而不是函数。

from dataclasses import dataclass

@dataclass
class DequeItems:
    current:tuple
    path:list

a = DequeItems(
        current=(0, 0),
        path=[(0, 0)]
    )
print(a)