locals = {}
return_annotation = ''
if return_type is not MISSING:
- locals['_return_type'] = return_type
- return_annotation = '->_return_type'
+ locals['__dataclass_return_type__'] = return_type
+ return_annotation = '->__dataclass_return_type__'
args = ','.join(args)
body = '\n'.join(f' {b}' for b in body)
# Return the text of the line in the body of __init__ that will
# initialize this field.
- default_name = f'_dflt_{f.name}'
+ default_name = f'__dataclass_dflt_{f.name}__'
if f.default_factory is not MISSING:
if f.init:
# This field has a default factory. If a parameter is
# given, use it. If not, call the factory.
globals[default_name] = f.default_factory
value = (f'{default_name}() '
- f'if {f.name} is _HAS_DEFAULT_FACTORY '
+ f'if {f.name} is __dataclass_HAS_DEFAULT_FACTORY__ '
f'else {f.name}')
else:
# This is a field that's not in the __init__ params, but
elif f.default is not MISSING:
# There's a default, this will be the name that's used to look
# it up.
- default = f'=_dflt_{f.name}'
+ default = f'=__dataclass_dflt_{f.name}__'
elif f.default_factory is not MISSING:
# There's a factory function. Set a marker.
- default = '=_HAS_DEFAULT_FACTORY'
- return f'{f.name}:_type_{f.name}{default}'
+ default = '=__dataclass_HAS_DEFAULT_FACTORY__'
+ return f'{f.name}:__dataclass_type_{f.name}__{default}'
def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init,
raise TypeError(f'non-default argument {f.name!r} '
'follows default argument')
- locals = {f'_type_{f.name}': f.type for f in fields}
+ locals = {f'__dataclass_type_{f.name}__': f.type for f in fields}
locals.update({
- 'MISSING': MISSING,
- '_HAS_DEFAULT_FACTORY': _HAS_DEFAULT_FACTORY,
+ '__dataclass_HAS_DEFAULT_FACTORY__': _HAS_DEFAULT_FACTORY,
'__dataclass_builtins_object__': object,
})
c = C(5)
self.assertEqual(c.BUILTINS, 5)
+ def test_field_with_special_single_underscore_names(self):
+ # gh-98886
+
+ @dataclass
+ class X:
+ x: int = field(default_factory=lambda: 111)
+ _dflt_x: int = field(default_factory=lambda: 222)
+
+ X()
+
+ @dataclass
+ class Y:
+ y: int = field(default_factory=lambda: 111)
+ _HAS_DEFAULT_FACTORY: int = 222
+
+ assert Y(y=222).y == 222
+
def test_field_named_like_builtin(self):
# Attribute names can shadow built-in names
# since code generation is used.