mirror of https://github.com/python/cpython
gh-96151: Use a private name for passing builtins to dataclass. This now allows for a field named BUILTIN (gh-98143)
This commit is contained in:
parent
87b5fd9d9d
commit
29f98b46b7
|
@ -426,13 +426,11 @@ def _recursive_repr(user_function):
|
|||
|
||||
def _create_fn(name, args, body, *, globals=None, locals=None,
|
||||
return_type=MISSING):
|
||||
# Note that we mutate locals when exec() is called. Caller
|
||||
# beware! The only callers are internal to this module, so no
|
||||
# Note that we may mutate locals. Callers beware!
|
||||
# The only callers are internal to this module, so no
|
||||
# worries about external callers.
|
||||
if locals is None:
|
||||
locals = {}
|
||||
if 'BUILTINS' not in locals:
|
||||
locals['BUILTINS'] = builtins
|
||||
return_annotation = ''
|
||||
if return_type is not MISSING:
|
||||
locals['_return_type'] = return_type
|
||||
|
@ -462,7 +460,7 @@ def _field_assign(frozen, name, value, self_name):
|
|||
# self_name is what "self" is called in this function: don't
|
||||
# hard-code "self", since that might be a field name.
|
||||
if frozen:
|
||||
return f'BUILTINS.object.__setattr__({self_name},{name!r},{value})'
|
||||
return f'__dataclass_builtins_object__.__setattr__({self_name},{name!r},{value})'
|
||||
return f'{self_name}.{name}={value}'
|
||||
|
||||
|
||||
|
@ -569,6 +567,7 @@ def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init,
|
|||
locals.update({
|
||||
'MISSING': MISSING,
|
||||
'_HAS_DEFAULT_FACTORY': _HAS_DEFAULT_FACTORY,
|
||||
'__dataclass_builtins_object__': object,
|
||||
})
|
||||
|
||||
body_lines = []
|
||||
|
|
|
@ -257,6 +257,14 @@ class TestCase(unittest.TestCase):
|
|||
c = C('foo')
|
||||
self.assertEqual(c.object, 'foo')
|
||||
|
||||
def test_field_named_BUILTINS_frozen(self):
|
||||
# gh-96151
|
||||
@dataclass(frozen=True)
|
||||
class C:
|
||||
BUILTINS: int
|
||||
c = C(5)
|
||||
self.assertEqual(c.BUILTINS, 5)
|
||||
|
||||
def test_field_named_like_builtin(self):
|
||||
# Attribute names can shadow built-in names
|
||||
# since code generation is used.
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Allow ``BUILTINS`` to be a valid field name for frozen dataclasses.
|
Loading…
Reference in New Issue