Skip to content

Commit 4e284ff

Browse files
gh-103395: Improve typing._GenericAlias.__dir__ coverage (GH-103396)
(cherry picked from commit a28e2ce) Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
1 parent da3b77b commit 4e284ff

File tree

1 file changed

+61
-2
lines changed

1 file changed

+61
-2
lines changed

Lib/test/test_typing.py

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,14 @@ def test_accepts_single_type(self):
851851
(*tuple[int],)
852852
Unpack[Tuple[int]]
853853

854+
def test_dir(self):
855+
dir_items = set(dir(Unpack[Tuple[int]]))
856+
for required_item in [
857+
'__args__', '__parameters__', '__origin__',
858+
]:
859+
with self.subTest(required_item=required_item):
860+
self.assertIn(required_item, dir_items)
861+
854862
def test_rejects_multiple_types(self):
855863
with self.assertRaises(TypeError):
856864
Unpack[Tuple[int], Tuple[str]]
@@ -1696,6 +1704,14 @@ def test_repr(self):
16961704
u = Optional[str]
16971705
self.assertEqual(repr(u), 'typing.Optional[str]')
16981706

1707+
def test_dir(self):
1708+
dir_items = set(dir(Union[str, int]))
1709+
for required_item in [
1710+
'__args__', '__parameters__', '__origin__',
1711+
]:
1712+
with self.subTest(required_item=required_item):
1713+
self.assertIn(required_item, dir_items)
1714+
16991715
def test_cannot_subclass(self):
17001716
with self.assertRaises(TypeError):
17011717
class C(Union):
@@ -1834,6 +1850,15 @@ def test_eq_hash(self):
18341850
self.assertNotEqual(C, Callable[..., int])
18351851
self.assertNotEqual(C, Callable)
18361852

1853+
def test_dir(self):
1854+
Callable = self.Callable
1855+
dir_items = set(dir(Callable[..., int]))
1856+
for required_item in [
1857+
'__args__', '__parameters__', '__origin__',
1858+
]:
1859+
with self.subTest(required_item=required_item):
1860+
self.assertIn(required_item, dir_items)
1861+
18371862
def test_cannot_instantiate(self):
18381863
Callable = self.Callable
18391864
with self.assertRaises(TypeError):
@@ -2146,6 +2171,14 @@ def test_repr(self):
21462171
self.assertEqual(repr(Literal[None]), "typing.Literal[None]")
21472172
self.assertEqual(repr(Literal[1, 2, 3, 3]), "typing.Literal[1, 2, 3]")
21482173

2174+
def test_dir(self):
2175+
dir_items = set(dir(Literal[1, 2, 3]))
2176+
for required_item in [
2177+
'__args__', '__parameters__', '__origin__',
2178+
]:
2179+
with self.subTest(required_item=required_item):
2180+
self.assertIn(required_item, dir_items)
2181+
21492182
def test_cannot_init(self):
21502183
with self.assertRaises(TypeError):
21512184
Literal()
@@ -7002,6 +7035,15 @@ def test_repr(self):
70027035
"typing.Annotated[typing.List[int], 4, 5]"
70037036
)
70047037

7038+
def test_dir(self):
7039+
dir_items = set(dir(Annotated[int, 4]))
7040+
for required_item in [
7041+
'__args__', '__parameters__', '__origin__',
7042+
'__metadata__',
7043+
]:
7044+
with self.subTest(required_item=required_item):
7045+
self.assertIn(required_item, dir_items)
7046+
70057047
def test_flatten(self):
70067048
A = Annotated[Annotated[int, 4], 5]
70077049
self.assertEqual(A, Annotated[int, 4, 5])
@@ -7701,6 +7743,15 @@ class MyClass: ...
77017743
c = Concatenate[MyClass, P]
77027744
self.assertNotEqual(c, Concatenate)
77037745

7746+
def test_dir(self):
7747+
P = ParamSpec('P')
7748+
dir_items = set(dir(Concatenate[int, P]))
7749+
for required_item in [
7750+
'__args__', '__parameters__', '__origin__',
7751+
]:
7752+
with self.subTest(required_item=required_item):
7753+
self.assertIn(required_item, dir_items)
7754+
77047755
def test_valid_uses(self):
77057756
P = ParamSpec('P')
77067757
T = TypeVar('T')
@@ -7969,10 +8020,18 @@ class Foo(Generic[T]):
79698020
def bar(self):
79708021
pass
79718022
baz = 3
8023+
__magic__ = 4
8024+
79728025
# The class attributes of the original class should be visible even
79738026
# in dir() of the GenericAlias. See bpo-45755.
7974-
self.assertIn('bar', dir(Foo[int]))
7975-
self.assertIn('baz', dir(Foo[int]))
8027+
dir_items = set(dir(Foo[int]))
8028+
for required_item in [
8029+
'bar', 'baz',
8030+
'__args__', '__parameters__', '__origin__',
8031+
]:
8032+
with self.subTest(required_item=required_item):
8033+
self.assertIn(required_item, dir_items)
8034+
self.assertNotIn('__magic__', dir_items)
79768035

79778036

79788037
class RevealTypeTests(BaseTestCase):

0 commit comments

Comments
 (0)