Python Dataclass дает мне объект 'function' не имеет атрибута __mro__? - PullRequest
0 голосов
/ 07 февраля 2019

Как и в последнем вопросе: 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 :

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 голосов
/ 07 февраля 2019

Аргументом 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 которого должен был бы получить доступ к гипотетическому MRO function.

Что касается , почему ваш класс данных вызывает эту ошибку, это потому, что декоратор dataclass должен декорировать класс , а не функцию.

from dataclasses import dataclass

@dataclass
class DequeItems:
    current:tuple
    path:list

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