Skip to content

Commit 2a85e87

Browse files
committed
lpython.py: Use default_factory for mutabletypes in dataclass initializer
1 parent 8df052e commit 2a85e87

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/runtime/lpython/lpython.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import os
33
import ctypes
44
import platform
5-
from dataclasses import dataclass as py_dataclass, is_dataclass as py_is_dataclass
5+
from dataclasses import dataclass as py_dataclass, is_dataclass as py_is_dataclass, field as py_field
66
import functools
77

88

@@ -53,6 +53,16 @@ def __class_getitem__(key):
5353
return Array(arg, key)
5454
arg.__class_getitem__ = __class_getitem__
5555

56+
class_mems = list(arg.__annotations__.keys())
57+
class_mems_init = dict(list(filter(lambda x: x[0] in class_mems, arg.__dict__.items())))
58+
59+
for class_mem in class_mems_init.keys():
60+
orig_val = class_mems_init[class_mem]
61+
if isinstance(orig_val, (int, float, str, bool, tuple)):
62+
setattr(arg, class_mem, py_field(default=orig_val))
63+
else:
64+
setattr(arg, class_mem, py_field(default_factory=lambda val=orig_val: val))
65+
5666
return py_dataclass(arg)
5767

5868
def is_ctypes_Structure(obj):

0 commit comments

Comments
 (0)