mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
bpo-38605: Make 'from __future__ import annotations' the default (GH-20434)
The hard part was making all the tests pass; there are some subtle issues here, because apparently the future import wasn't tested very thoroughly in previous Python versions. For example, `inspect.signature()` returned type objects normally (except for forward references), but strings with the future import. We changed it to try and return type objects by calling `typing.get_type_hints()`, but fall back on returning strings if that function fails (which it may do if there are future references in the annotations that require passing in a specific namespace to resolve).
This commit is contained in:
parent
bef7d299eb
commit
044a1048ca
27 changed files with 403 additions and 299 deletions
|
@ -302,14 +302,14 @@ class PositionalOnlyTestCase(unittest.TestCase):
|
|||
def f(x: int, /): ...
|
||||
return f
|
||||
|
||||
assert inner_has_pos_only().__annotations__ == {'x': int}
|
||||
assert inner_has_pos_only().__annotations__ == {'x': 'int'}
|
||||
|
||||
class Something:
|
||||
def method(self):
|
||||
def f(x: int, /): ...
|
||||
return f
|
||||
|
||||
assert Something().method().__annotations__ == {'x': int}
|
||||
assert Something().method().__annotations__ == {'x': 'int'}
|
||||
|
||||
def multiple_levels():
|
||||
def inner_has_pos_only():
|
||||
|
@ -317,7 +317,7 @@ class PositionalOnlyTestCase(unittest.TestCase):
|
|||
return f
|
||||
return inner_has_pos_only()
|
||||
|
||||
assert multiple_levels().__annotations__ == {'x': int}
|
||||
assert multiple_levels().__annotations__ == {'x': 'int'}
|
||||
|
||||
def test_same_keyword_as_positional_with_kwargs(self):
|
||||
def f(something,/,**kwargs):
|
||||
|
@ -429,17 +429,6 @@ class PositionalOnlyTestCase(unittest.TestCase):
|
|||
|
||||
self.assertEqual(C().method(), sentinel)
|
||||
|
||||
def test_annotations_constant_fold(self):
|
||||
def g():
|
||||
def f(x: not (int is int), /): ...
|
||||
|
||||
# without constant folding we end up with
|
||||
# COMPARE_OP(is), IS_OP (0)
|
||||
# with constant folding we should expect a IS_OP (1)
|
||||
codes = [(i.opname, i.argval) for i in dis.get_instructions(g)]
|
||||
self.assertNotIn(('UNARY_NOT', None), codes)
|
||||
self.assertIn(('IS_OP', 1), codes)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue