Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
4d12e4dc
Commit
4d12e4dc
authored
Aug 12, 2018
by
Vadim Pushtaev
Committed by
Eric V. Smith
Aug 12, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bpo-34213: Allow dataclasses to work with a field named 'object'. (GH-8452)
parent
65b5ef02
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
58 additions
and
1 deletion
+58
-1
Lib/dataclasses.py
Lib/dataclasses.py
+7
-1
Lib/test/test_dataclasses.py
Lib/test/test_dataclasses.py
+50
-0
Misc/NEWS.d/next/Library/2018-07-25-00-40-14.bpo-34213.O15MgP.rst
...S.d/next/Library/2018-07-25-00-40-14.bpo-34213.O15MgP.rst
+1
-0
No files found.
Lib/dataclasses.py
View file @
4d12e4dc
...
...
@@ -4,6 +4,7 @@ import copy
import
types
import
inspect
import
keyword
import
builtins
__all__
=
[
'dataclass'
,
'field'
,
...
...
@@ -343,6 +344,11 @@ def _create_fn(name, args, body, *, globals=None, locals=None,
# worries about external callers.
if
locals
is
None
:
locals
=
{}
# __builtins__ may be the "builtins" module or
# the value of its "__dict__",
# so make sure "__builtins__" is the module.
if
globals
is
not
None
and
'__builtins__'
not
in
globals
:
globals
[
'__builtins__'
]
=
builtins
return_annotation
=
''
if
return_type
is
not
MISSING
:
locals
[
'_return_type'
]
=
return_type
...
...
@@ -365,7 +371,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'object.__setattr__(
{
self_name
}
,
{
name
!
r
}
,
{
value
}
)'
return
f'
__builtins__.
object.__setattr__(
{
self_name
}
,
{
name
!
r
}
,
{
value
}
)'
return
f'
{
self_name
}
.
{
name
}
=
{
value
}
'
...
...
Lib/test/test_dataclasses.py
View file @
4d12e4dc
...
...
@@ -6,6 +6,7 @@ from dataclasses import *
import
pickle
import
inspect
import
builtins
import
unittest
from
unittest.mock
import
Mock
from
typing
import
ClassVar
,
Any
,
List
,
Union
,
Tuple
,
Dict
,
Generic
,
TypeVar
,
Optional
...
...
@@ -192,6 +193,55 @@ class TestCase(unittest.TestCase):
first
=
next
(
iter
(
sig
.
parameters
))
self
.
assertEqual
(
'self'
,
first
)
def
test_field_named_object
(
self
):
@
dataclass
class
C
:
object
:
str
c
=
C
(
'foo'
)
self
.
assertEqual
(
c
.
object
,
'foo'
)
def
test_field_named_object_frozen
(
self
):
@
dataclass
(
frozen
=
True
)
class
C
:
object
:
str
c
=
C
(
'foo'
)
self
.
assertEqual
(
c
.
object
,
'foo'
)
def
test_field_named_like_builtin
(
self
):
# Attribute names can shadow built-in names
# since code generation is used.
# Ensure that this is not happening.
exclusions
=
{
'None'
,
'True'
,
'False'
}
builtins_names
=
sorted
(
b
for
b
in
builtins
.
__dict__
.
keys
()
if
not
b
.
startswith
(
'__'
)
and
b
not
in
exclusions
)
attributes
=
[(
name
,
str
)
for
name
in
builtins_names
]
C
=
make_dataclass
(
'C'
,
attributes
)
c
=
C
(
*
[
name
for
name
in
builtins_names
])
for
name
in
builtins_names
:
self
.
assertEqual
(
getattr
(
c
,
name
),
name
)
def
test_field_named_like_builtin_frozen
(
self
):
# Attribute names can shadow built-in names
# since code generation is used.
# Ensure that this is not happening
# for frozen data classes.
exclusions
=
{
'None'
,
'True'
,
'False'
}
builtins_names
=
sorted
(
b
for
b
in
builtins
.
__dict__
.
keys
()
if
not
b
.
startswith
(
'__'
)
and
b
not
in
exclusions
)
attributes
=
[(
name
,
str
)
for
name
in
builtins_names
]
C
=
make_dataclass
(
'C'
,
attributes
,
frozen
=
True
)
c
=
C
(
*
[
name
for
name
in
builtins_names
])
for
name
in
builtins_names
:
self
.
assertEqual
(
getattr
(
c
,
name
),
name
)
def
test_0_field_compare
(
self
):
# Ensure that order=False is the default.
@
dataclass
...
...
Misc/NEWS.d/next/Library/2018-07-25-00-40-14.bpo-34213.O15MgP.rst
0 → 100644
View file @
4d12e4dc
Allow frozen dataclasses to have a field named "object". Previously this conflicted with an internal use of "object".
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment