mirror of https://github.com/python/cpython
gh-103395: Improve `typing._GenericAlias.__dir__` coverage (#103396)
This commit is contained in:
parent
ecad802e3f
commit
a28e2ce3fb
|
@ -855,6 +855,14 @@ class UnpackTests(BaseTestCase):
|
||||||
(*tuple[int],)
|
(*tuple[int],)
|
||||||
Unpack[Tuple[int]]
|
Unpack[Tuple[int]]
|
||||||
|
|
||||||
|
def test_dir(self):
|
||||||
|
dir_items = set(dir(Unpack[Tuple[int]]))
|
||||||
|
for required_item in [
|
||||||
|
'__args__', '__parameters__', '__origin__',
|
||||||
|
]:
|
||||||
|
with self.subTest(required_item=required_item):
|
||||||
|
self.assertIn(required_item, dir_items)
|
||||||
|
|
||||||
def test_rejects_multiple_types(self):
|
def test_rejects_multiple_types(self):
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
Unpack[Tuple[int], Tuple[str]]
|
Unpack[Tuple[int], Tuple[str]]
|
||||||
|
@ -1699,6 +1707,14 @@ class UnionTests(BaseTestCase):
|
||||||
u = Optional[str]
|
u = Optional[str]
|
||||||
self.assertEqual(repr(u), 'typing.Optional[str]')
|
self.assertEqual(repr(u), 'typing.Optional[str]')
|
||||||
|
|
||||||
|
def test_dir(self):
|
||||||
|
dir_items = set(dir(Union[str, int]))
|
||||||
|
for required_item in [
|
||||||
|
'__args__', '__parameters__', '__origin__',
|
||||||
|
]:
|
||||||
|
with self.subTest(required_item=required_item):
|
||||||
|
self.assertIn(required_item, dir_items)
|
||||||
|
|
||||||
def test_cannot_subclass(self):
|
def test_cannot_subclass(self):
|
||||||
with self.assertRaisesRegex(TypeError,
|
with self.assertRaisesRegex(TypeError,
|
||||||
r'Cannot subclass typing\.Union'):
|
r'Cannot subclass typing\.Union'):
|
||||||
|
@ -1839,6 +1855,15 @@ class BaseCallableTests:
|
||||||
self.assertNotEqual(C, Callable[..., int])
|
self.assertNotEqual(C, Callable[..., int])
|
||||||
self.assertNotEqual(C, Callable)
|
self.assertNotEqual(C, Callable)
|
||||||
|
|
||||||
|
def test_dir(self):
|
||||||
|
Callable = self.Callable
|
||||||
|
dir_items = set(dir(Callable[..., int]))
|
||||||
|
for required_item in [
|
||||||
|
'__args__', '__parameters__', '__origin__',
|
||||||
|
]:
|
||||||
|
with self.subTest(required_item=required_item):
|
||||||
|
self.assertIn(required_item, dir_items)
|
||||||
|
|
||||||
def test_cannot_instantiate(self):
|
def test_cannot_instantiate(self):
|
||||||
Callable = self.Callable
|
Callable = self.Callable
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
|
@ -2151,6 +2176,14 @@ class LiteralTests(BaseTestCase):
|
||||||
self.assertEqual(repr(Literal[None]), "typing.Literal[None]")
|
self.assertEqual(repr(Literal[None]), "typing.Literal[None]")
|
||||||
self.assertEqual(repr(Literal[1, 2, 3, 3]), "typing.Literal[1, 2, 3]")
|
self.assertEqual(repr(Literal[1, 2, 3, 3]), "typing.Literal[1, 2, 3]")
|
||||||
|
|
||||||
|
def test_dir(self):
|
||||||
|
dir_items = set(dir(Literal[1, 2, 3]))
|
||||||
|
for required_item in [
|
||||||
|
'__args__', '__parameters__', '__origin__',
|
||||||
|
]:
|
||||||
|
with self.subTest(required_item=required_item):
|
||||||
|
self.assertIn(required_item, dir_items)
|
||||||
|
|
||||||
def test_cannot_init(self):
|
def test_cannot_init(self):
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
Literal()
|
Literal()
|
||||||
|
@ -7315,6 +7348,15 @@ class AnnotatedTests(BaseTestCase):
|
||||||
"typing.Annotated[typing.List[int], 4, 5]"
|
"typing.Annotated[typing.List[int], 4, 5]"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_dir(self):
|
||||||
|
dir_items = set(dir(Annotated[int, 4]))
|
||||||
|
for required_item in [
|
||||||
|
'__args__', '__parameters__', '__origin__',
|
||||||
|
'__metadata__',
|
||||||
|
]:
|
||||||
|
with self.subTest(required_item=required_item):
|
||||||
|
self.assertIn(required_item, dir_items)
|
||||||
|
|
||||||
def test_flatten(self):
|
def test_flatten(self):
|
||||||
A = Annotated[Annotated[int, 4], 5]
|
A = Annotated[Annotated[int, 4], 5]
|
||||||
self.assertEqual(A, Annotated[int, 4, 5])
|
self.assertEqual(A, Annotated[int, 4, 5])
|
||||||
|
@ -8033,6 +8075,15 @@ class ConcatenateTests(BaseTestCase):
|
||||||
c = Concatenate[MyClass, P]
|
c = Concatenate[MyClass, P]
|
||||||
self.assertNotEqual(c, Concatenate)
|
self.assertNotEqual(c, Concatenate)
|
||||||
|
|
||||||
|
def test_dir(self):
|
||||||
|
P = ParamSpec('P')
|
||||||
|
dir_items = set(dir(Concatenate[int, P]))
|
||||||
|
for required_item in [
|
||||||
|
'__args__', '__parameters__', '__origin__',
|
||||||
|
]:
|
||||||
|
with self.subTest(required_item=required_item):
|
||||||
|
self.assertIn(required_item, dir_items)
|
||||||
|
|
||||||
def test_valid_uses(self):
|
def test_valid_uses(self):
|
||||||
P = ParamSpec('P')
|
P = ParamSpec('P')
|
||||||
T = TypeVar('T')
|
T = TypeVar('T')
|
||||||
|
@ -8310,10 +8361,18 @@ class SpecialAttrsTests(BaseTestCase):
|
||||||
def bar(self):
|
def bar(self):
|
||||||
pass
|
pass
|
||||||
baz = 3
|
baz = 3
|
||||||
|
__magic__ = 4
|
||||||
|
|
||||||
# The class attributes of the original class should be visible even
|
# The class attributes of the original class should be visible even
|
||||||
# in dir() of the GenericAlias. See bpo-45755.
|
# in dir() of the GenericAlias. See bpo-45755.
|
||||||
self.assertIn('bar', dir(Foo[int]))
|
dir_items = set(dir(Foo[int]))
|
||||||
self.assertIn('baz', dir(Foo[int]))
|
for required_item in [
|
||||||
|
'bar', 'baz',
|
||||||
|
'__args__', '__parameters__', '__origin__',
|
||||||
|
]:
|
||||||
|
with self.subTest(required_item=required_item):
|
||||||
|
self.assertIn(required_item, dir_items)
|
||||||
|
self.assertNotIn('__magic__', dir_items)
|
||||||
|
|
||||||
|
|
||||||
class RevealTypeTests(BaseTestCase):
|
class RevealTypeTests(BaseTestCase):
|
||||||
|
|
Loading…
Reference in New Issue