Attila Toth
Attila Toth

Reputation: 469

Python dataclass prints default values when calling fields function

I just started to use dataclasses. I have created a python dataclass:

from dataclasses import dataclass, fields
from typing import Optional


@dataclass
class CSVData:
    SUPPLIER_AID: str = ""
    EAN: Optional[str] = None
    DESCRIPTION_SHORT: str = ""
    DESCRIPTION_LONG: str = "Article long description"

After creating an instance of a this dataclass and printing it out:

data = CSVData(SUPPLIER_AID='1234-568',
               EAN='EAN number',
               DESCRIPTION_SHORT='Article Name')

print(data)

output is:

CSVData(SUPPLIER_AID='1234-568', EAN='EAN number', DESCRIPTION_SHORT='Article name', DESCRIPTION_LONG='Article long description')

When i call the fields function:

for field in fields(data):
    print(field.default)

output is:

"", None, "", Article long description

I would expect to print: 1234-568, EAN number, Article Name, Article long description

Upvotes: 0

Views: 1003

Answers (1)

Adid
Adid

Reputation: 1584

This is how the dataclass.fields method works (see documentation). If you want to iterate over the values, you can use asdict or astuple instead:

from dataclasses import dataclass, asdict
from typing import Optional


@dataclass
class CSVData:
    SUPPLIER_AID: str = ""
    EAN: Optional[str] = None
    DESCRIPTION_SHORT: str = ""
    DESCRIPTION_LONG: str = "Article long description"


data = CSVData(SUPPLIER_AID='1234-568',
               EAN='EAN number',
               DESCRIPTION_SHORT='Article Name')

for field in asdict(data).values():
    print(field)

Which prints:

1234-568
EAN number
Article Name
Article long description

Upvotes: 3

Related Questions