source

데이터 클래스에 기본 목록 인수 전달

manycodes 2023. 5. 11. 21:35
반응형

데이터 클래스에 기본 목록 인수 전달

저는 우리 반에서 기본 인수를 통과하고 싶지만, 왠지 문제가 있습니다.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Pizza():
    ingredients: List = field(default_factory=['dow', 'tomatoes'])
    meat: str = field(default='chicken')

    def __repr__(self):
        return 'preparing_following_pizza {} {}'.format(self.ingredients, self.meat)

지금 인스턴스화를 시도하면Pizza다음 오류가 발생합니다.

>>> my_order = Pizza()
Traceback (most recent call last):
  File "pizza.py", line 13, in <module>
    Pizza()
  File "<string>", line 2, in __init__
TypeError: 'list' object is not callable

내가 뭘 잘못하고 있는 거지?

문서에서:

대상 매개 변수field()다음과 같습니다.

  • default_factory: 제공된 경우 이 필드에 기본값이 필요할 때 호출될 0-인수 호출 가능이어야 합니다.다른 목적 중에서도 아래에서 설명하는 것처럼 기본값이 가변적인 필드를 지정하는 데 사용할 수 있습니다.default와 default_factory를 모두 지정하는 것은 오류입니다.

당신의.default_factory는 0자리 호출 가능이 아니라 목록이며, 이는 오류의 원인입니다.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Pizza():
    ingredients: List = field(default_factory=['dow', 'tomatoes'])  # <- wrong!

대신 람다 함수를 사용합니다.

@dataclass
class Pizza():
    ingredients: List = field(default_factory=lambda: ['dow', 'tomatoes'])

복잡한 데이터 유형의 경우 다음과 같이 축약합니다.

import copy
from dataclasses import dataclass, field
from typing import Dict, Tuple

def default_field(obj):
    return field(default_factory=lambda: copy.copy(obj))

@dataclass
class C:
    complex_attribute: Dict[str, Tuple[int, str]] = default_field({"a": (1, "x"), "b": (1, "y")})

언급URL : https://stackoverflow.com/questions/52063759/passing-default-list-argument-to-dataclasses

반응형