>source

선택적 속성이있는 클래스가 있습니다. 선택적 속성을 지정하지 않고 클래스를 인스턴스화하려고하면 오류가 발생합니다. 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)

선택적 인수를 지정하지 않고 개체를 인스턴스화하려면 어떻게해야합니까?

  • 답변 # 1

    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)
    
    

관련 자료

  • 이전 python - 이진 문자열 집합에서 겹치는 비트 찾기
  • 다음 TRUE/FALSE를 Google 스프레드 시트의 확인란으로 변환하는 방법은 무엇입니까?