Skip to content

dataclasses.astuple breaks NamedTuple attribute of dataclass instanceΒ #151

@isvoboda

Description

@isvoboda

It seems the fix of https://bugs.python.org/issue34363 is missing in dataclasses version 0.7 backported to python 3.6

# 3.6.8 (default, Feb 28 2019, 22:12:13)
# [GCC 8.2.1 20181127](6, 0, 1)
# dataclasses 0.7

from dataclasses import InitVar, astuple, dataclass, field
from typing import NamedTuple, Tuple
import numpy as np

class A(NamedTuple):
    x: float = np.nan
    y: float = np.nan

@dataclass
class B:
    tuple_a: InitVar[Tuple] = None
    named_tuple_a: A = field(init=False, default=A())

    def __post_init__(self, tuple_a):
        if tuple_a is not None:
            self.named_tuple_a = A(*tuple_a)

b = B()
astuple(b)

>> (A(x=<generator object _astuple_inner.<locals>.<genexpr> at 0x7f7dec0902b0>, y=nan),)

While the same code in Python 3.7.4 gives:

# 3.7.4 (default, Oct  4 2019, 06:57:26)
# [GCC 9.2.0] (6, 0, 1)

from dataclasses import InitVar, astuple, dataclass, field
from typing import NamedTuple, Tuple
import numpy as np

class A(NamedTuple):
    x: float = np.nan
    y: float = np.nan

@dataclass
class B:
    tuple_a: InitVar[Tuple] = None
    named_tuple_a: A = field(init=False, default=A())

    def __post_init__(self, tuple_a):
        if tuple_a is not None:
            self.named_tuple_a = A(*tuple_a)

b = B()
astuple(b)

>> (A(x=nan, y=nan),)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions