[Python-checkins] bpo-39019: Implement missing __class_getitem__ for subprocess classes (GH-17558)
Ivan Levkivskyi
webhook-mailer at python.org
Mon Dec 30 11:02:21 EST 2019
https://github.com/python/cpython/commit/4dc5a9df59837446ec1dc5b7a0e6ce95ae5b5cec
commit: 4dc5a9df59837446ec1dc5b7a0e6ce95ae5b5cec
branch: master
author: Batuhan Taşkaya <47358913+isidentical at users.noreply.github.com>
committer: Ivan Levkivskyi <levkivskyi at gmail.com>
date: 2019-12-30T16:02:04Z
summary:
bpo-39019: Implement missing __class_getitem__ for subprocess classes (GH-17558)
files:
A Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst
M Lib/subprocess.py
M Lib/test/test_subprocess.py
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index ba6f1983a5a22..30f0d1be154c4 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -446,6 +446,19 @@ def __repr__(self):
args.append('stderr={!r}'.format(self.stderr))
return "{}({})".format(type(self).__name__, ', '.join(args))
+ def __class_getitem__(cls, type):
+ """Provide minimal support for using this class as generic
+ (for example in type annotations).
+
+ See PEP 484 and PEP 560 for more details. For example,
+ `CompletedProcess[bytes]` is a valid expression at runtime
+ (type argument `bytes` indicates the type used for stdout).
+ Note, no type checking happens at runtime, but a static type
+ checker can be used.
+ """
+ return cls
+
+
def check_returncode(self):
"""Raise CalledProcessError if the exit code is non-zero."""
if self.returncode:
@@ -987,6 +1000,17 @@ def __repr__(self):
obj_repr = obj_repr[:76] + "...>"
return obj_repr
+ def __class_getitem__(cls, type):
+ """Provide minimal support for using this class as generic
+ (for example in type annotations).
+
+ See PEP 484 and PEP 560 for more details. For example, `Popen[bytes]`
+ is a valid expression at runtime (type argument `bytes` indicates the
+ type used for stdout). Note, no type checking happens at runtime, but
+ a static type checker can be used.
+ """
+ return cls
+
@property
def universal_newlines(self):
# universal_newlines as retained as an alias of text_mode for API
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 87322c6406bd5..2073fd146177a 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -1435,6 +1435,9 @@ def test_file_not_found_with_bad_cwd(self):
subprocess.Popen(['exit', '0'], cwd='/some/nonexistent/directory')
self.assertEqual(c.exception.filename, '/some/nonexistent/directory')
+ def test_class_getitems(self):
+ self.assertIs(subprocess.Popen[bytes], subprocess.Popen)
+ self.assertIs(subprocess.CompletedProcess[str], subprocess.CompletedProcess)
class RunFuncTestCase(BaseTestCase):
def run_python(self, code, **kwargs):
diff --git a/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst b/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst
new file mode 100644
index 0000000000000..b64a56edc50c7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst
@@ -0,0 +1,2 @@
+Implement dummy ``__class_getitem__`` for ``subprocess.Popen``,
+``subprocess.CompletedProcess``
More information about the Python-checkins
mailing list