Python Dataclass дает мне объект 'function' не имеет атрибута __mro__?

Как и в последнем вопросе: TypeError: объект int не является итеративным, пока не существует итераций? Я нахожу проблему в моей программе. То есть: в Python

  • set( (0,0) )на самом деле дает вам{0}, но я хочу{(0,0)}
  • collections.deque( ((0, 0), [ (0, 0) ] ) ).popleft()на самом деле дает вам(0,0)тогда как я хочу((0, 0), [ (0, 0) ] )

Так что теперь я думаю о разработке собственных классов данных. Тем не менее, в тестовом коде я обнаружил, что у объекта 'function' нет проблемы с атрибутомmro.

Тестовый код 1:

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

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

Скриншот ошибки тестового кода 1:

Тестовый код 2:

from dataclasses import dataclass

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

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

Тестовый код 2 ошибка scrrenshot:

Моя версия Python - Anaconda 3.6.8

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)
Другие вопросы по тегам