python - 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)
如何在不指定可选参数的情况下实例化对象?
解决方案
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)
推荐阅读
- c++ - jpeg_read_image' 不是 'boost::gil' 的成员
- powershell - 如何在 PowerShell 5.1 中转义非 ascii 符号?
- html - 图像变得比带边框的 div 容器大并溢出
- android - W/System:忽略标头 X-Firebase-Locale,因为它的值为 null
- reactjs - 我想在 Form.Item Ant 设计中处理错误状态。如何处理禁用按钮?
- sql - 获取用户和普通朋友的 SQL 查询
- groovy - 如何在詹金斯 delarative piepline 中获取会话数据
- windows - 传递参数时,带有 docker 命令的 Bash 脚本未运行 | 环境:带有 docker 桌面的 WSL2
- php - PHP / 高级自定义字段 (ACF) - 删除重复值
- r - 在没有循环函数的情况下增加情节持续时间向量的数据分辨率