首页 > 解决方案 > 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)

如何在不指定可选参数的情况下实例化对象?

标签: pythonattr

解决方案


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)

推荐阅读