This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author Kevin Shweh
Recipients Kevin Shweh
Date 2019-11-30.23:53:26
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1575158007.0.0.672423182846.issue38947@roundup.psfhosted.org>
In-reply-to
Content
The following code:

    from dataclasses import dataclass, field
    from typing import Callable
     
    @dataclass
    class Foo:
    	callback: Callable[[int], int] = lambda x: x**2
     
    @dataclass
    class Bar:
    	callback: Callable[[int], int] = field(init=False, default=lambda x: x**2)
     
    print(Foo().callback(2))
    print(Bar().callback(2))

prints 4 for the first print, but throws a TypeError for the second. This is because Foo() stores the default callback in the instance dict, while Bar() only has it in the class dict. Bar().callback triggers the descriptor protocol and produces a method object instead of the original callback.

There does not seem to be any indication in the dataclasses documentation that these fields will behave differently. It seems like they should behave the same, and/or the documentation should be clearer about how the default value/non-init field interaction behaves.
History
Date User Action Args
2019-11-30 23:53:27Kevin Shwehsetrecipients: + Kevin Shweh
2019-11-30 23:53:27Kevin Shwehsetmessageid: <1575158007.0.0.672423182846.issue38947@roundup.psfhosted.org>
2019-11-30 23:53:26Kevin Shwehlinkissue38947 messages
2019-11-30 23:53:26Kevin Shwehcreate