Python @attr.s вызывает ошибку при создании объекта с необязательным атрибутом

У меня есть класс с необязательным атрибутом. Когда я пытаюсь создать экземпляр класса без указания необязательного атрибута, я получаю сообщение об ошибке TypeError: __init__() missing 1 required positional argument: 'time_range'.

import attr
from typeguard import typechecked
from typing import Optional

@attr.s(auto_attribs=True)
class TimeRange:
    start_time: Optional[str] = attr.ib()
    end_time: Optional[str] = attr.ib()

    @typechecked
    def __init__(
        self,
        start_time: Optional[str] = None,
        end_time: Optional[str] = None,
    ):
        self.start_time = start_time
        self.end_time = end_time

@attr.s(auto_attribs=True)
class Date:
    date: int
    time_range: Optional[TimeRange] = attr.ib()

    @typechecked
    def __init__(
        self,
        date: int,
        time_range: Optional[TimeRange] = None,
    ):
        self.date = date
        self.time_range = time_range


# This throws an error
new_date = Date(date=731)
# This also throws an error
new_date = Date(731)

Как я могу создать экземпляр объекта без указания необязательного аргумента?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
711
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

attr.s создает функцию __init__, которая перезаписывает вашу. Чтобы исправить это, просто предоставьте __init__=False:

import attr
from typeguard import typechecked
from typing import Optional

# note the init=False
@attr.s(auto_attribs=True, init=False)
class TimeRange:
    start_time: Optional[str] = attr.ib()
    end_time: Optional[str] = attr.ib()

    @typechecked
    def __init__(
        self,
        start_time: Optional[str] = None,
        end_time: Optional[str] = None,
    ):
        self.start_time = start_time
        self.end_time = end_time

@attr.s(auto_attribs=True, init=False)
class Date:
    date: int
    time_range: Optional[TimeRange] = attr.ib()

    @typechecked
    def __init__(
        self,
        date: int,
        time_range: Optional[TimeRange] = None,
    ):
        self.date = date
        self.time_range = time_range


new_date = Date(date=731)
new_date = Date(731)

Еще проще: вам не нужно ни писать пользовательскую функцию инициализации, ни блокировать attr, чтобы сгенерировать ее.

Вам просто нужно добавить значение по умолчанию в attr.ib вызове каждого необязательного свойства (как вы сделали в своей пользовательской функции инициализации).

import attr
from typing import Optional

@attr.s(auto_attribs=True)
class TimeRange:
    start_time: Optional[str] = attr.ib(default=None)
    end_time: Optional[str] = attr.ib(default=None)

@attr.s(auto_attribs=True)
class Date:
    date: int
    time_range: Optional[TimeRange] = attr.ib(default=None)

# No more errors
new_date = Date(date=731)
new_date = Date(731)

Другие вопросы по теме