Вам не нужно другое определение класса.Вы просто хотите сделать эти аргументы необязательными со значением по умолчанию для атрибута, если вы не передали значение month
.Функция фабрики namedtuple()
не поддерживает этот вариант использования.
Но это не единственный способ создания именованного кортежа.Вы также можете создать подкласс typing.NamedTuple
:
from typing import NamedTuple, Optional
class VagueTimePeriod(NamedTuple):
year: int
month: Optional[int] = None
Это определение класса для именованного кортежа, где month
является необязательным, если вы не укажете месяц, на который он оставлензначение по умолчанию:
>>> VagueTimePeriod(2012)
VagueTimePeriod(year=2012, month=None)
>>> VagueTimePeriod(2012, 3)
VagueTimePeriod(year=2012, month=3)
Однако я подозреваю, что вам действительно нужен класс данных .Простой класс, который в основном содержит только некоторые данные.
Python 3.7 имеет новый dataclasses
модуль , или вы можете установить attrs
проект .Класс данных может иметь необязательные атрибуты (по умолчанию это значение, которое вы указали во время определения):
from dataclasses import dataclass
from typing import Optional
@dataclass
class VagueTimePeriod:
year: int
month: Optional[int] = None
vtp1 = VagueTimePeriod(2012)
vtp2 = VagueTimePeriod(2012, 3)
Классы данных предоставляют значительно упрощенный синтаксис для определения небольшого класса, который поставляется с представлением, проверкой на равенство и необязательнымподдержка упорядочения, хеширования и неизменяемости.
Классы данных также полностью поддерживают наследование, что не допускается для именованных кортежей.
Класс данных не является итеративным или неизменным автоматически, но его можно сделать таким, см. это мой предыдущий ответ , где я определяю простой DataclassSequence
базовый класс, который добавляет поведение последовательности.
Небольшая демонстрация:
>>> @dataclass(frozen=True)
... class VagueTimePeriod:
... year: int
... month: Optional[int] = None
...
>>> VagueTimePeriod(2012)
VagueTimePeriod(year=2012, month=None)
VagueTimePeriod(2012, 3)
VagueTimePeriod(year=2012, month=3)