[issue45366] dataclass init=False field with default works but default_factory does not

2021-10-04 Thread simple_coder878


New submission from simple_coder878 :

Simple example
from dataclasses import dataclass, field

@dataclass(init=False)
class TestObject(object):
m: str = field(default='hi')
k: list = field(default_factory=list)

def test(self):
print(f'm is {self.m} ')
print(f'k is {self.k}')

if __name__ == '__main__':
myobject = TestObject()
myobject.test()


Produces:

Traceback (most recent call last):
  File "H:\unit_test\tests_dataclass.py", line 81, in 
myobject.test()
  File "H:\unit_test\tests_dataclass.py", line 76, in test
print(f'k is {self.k}')
AttributeError: 'TestObject' object has no attribute 'k'
m is hi 

So m is initialized to hi but k just disappears

But wait there's more!

If i do 

from dataclasses import dataclass, field

@dataclass(init=False)
class TestObject(object):
m: str = field(default='hi')
k: list = field(default_factory=list)

def test(self):
print(f'm is {self.m} ')
print(f'k is {self.k}')


@dataclass
class InheritedTestObject(TestObject):

def __post_init__(self):
super().__init__()
print(f'Inherited m is {self.m} ')
print(f'Inherited k is {self.k}')
print(f'Inherited g is {self.k}')


if __name__ == '__main__':
myobject = InheritedTestObject()
myobject.test()

It produces:

Inherited m is hi 
Inherited k is []
Inherited g is []
m is hi 
k is []

Process finished with exit code 0

NO ERRORS!

It seems like a bug to me, but what is the expected behavior in this case? I 
would expect the first case to not error out and should have an empty list.

I've only tested this on Python 3.9 so far.

--
components: ctypes
messages: 403182
nosy: simple_coder878
priority: normal
severity: normal
status: open
title: dataclass init=False field with default works but default_factory does 
not
type: behavior
versions: Python 3.9

___
Python tracker 
<https://bugs.python.org/issue45366>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45366] dataclass init=False field with default works but default_factory does not

2021-10-04 Thread simple_coder878


simple_coder878  added the comment:

Also wanted to add that I did try another variation of the first example where 
I set the default_factory field's init value to False and I got the same error.

from dataclasses import dataclass, field

@dataclass(init=False)
class TestObject(object):
m: str = field(default='hi')
k: list = field(init=False, default_factory=list)

def test(self):
print(f'm is {self.m} ')
print(f'k is {self.k}')

if __name__ == '__main__':
myobject = TestObject()
myobject.test()

Also produces 

Traceback (most recent call last):
  File "H:\unit_test\tests_dataclass.py", line 81, in 
myobject.test()
  File "H:\unit_test\tests_dataclass.py", line 76, in test
print(f'k is {self.k}')
AttributeError: 'TestObject' object has no attribute 'k'
m is hi

--

___
Python tracker 
<https://bugs.python.org/issue45366>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com