Как я могу использовать список [customClass] в качестве типа с @dataclass в Python 3.7.x

У меня есть следующие классы данных.

@dataclass
class Package:
    '''Class for keeping track of one destination.'''
    _address: []

@dataclass
class Destination:
'''Class for keeping track of a destination.'''
_start: str
_end: str
_distance: float

def __init__(self, param):
    self._start = param[0]
    self._end = param[1]
    self._distance = param[2]

и следующий класс данных, который вызывает указанный выше класс.

@dataclass
class DestinationContainer:
    '''Class for keeping track of a package destination.
       and all the possible combinations of potential next destination '''
    _package: Package
    _destinations: List[Destination]

    def __init__(self):
        pass

    def addPkg(self,param):
        self._package = param

Я получаю следующую ошибку при попытке запустить программу

TypeError: параметры универсальных типов должны быть типами.

Я также пробовал таким образом вызвать участника _destinations.

_destinations: List[Destination] = field(default_factory=list)

Затем я получаю следующую ошибку

TypeError: параметры универсальных типов должны быть типами.

Я также попытался установить член класса как

    _destinations: [] 

И после проверки объекта-экземпляра внутри класса нет списка.

Я тоже пробовал.

_destinations: List = field(default_factory=lambda: [])

и я получаю следующую ошибку при попытке добавить в список

AttributeError: объект 'DestinationContainer' не имеет атрибута '_destinations'


person RandomNumberFun    schedule 11.01.2019    source источник
comment
Как определяется Destination? Ошибка связана с List[Destination], потому что думает, что Destination не является типом. Кроме того, вам вообще не следует определять свой собственный __init__. @dataclass создаст его для вас. Вы должны использовать __post_init__, если вам нужно что-то сделать. сверх того.   -  person Patrick Haugh    schedule 11.01.2019


Ответы (1)


Как сказал Патрик в комментариях, ваша основная проблема в том, что вы определяете свои собственные __init__ функции при использовании @dataclass. Если вы удалите его и немного измените структуру кода, он должен работать должным образом:

from dataclasses import dataclass
from typing import List

@dataclass
class Package:
    _address: []

@dataclass
class Destination:
    _start: str
    _end: str
    _distance: float

@dataclass
class DestinationContainer:
    _package: Package
    _destinations: List[Destination]

    def addPkg(self, param):
        # sure this shouldn't be "self._package.append(param)"? 
        self._package = param


# works
dc = DestinationContainer(
    Package(['some address']),
    [Destination('s', 'e', 1.0)]
)
# also works
dc.addPkg(Package(['some other address']))
person Arne    schedule 11.03.2019