summaryrefslogtreecommitdiffstats
path: root/Lib/platform.py
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2020-12-31 19:08:03 (GMT)
committerGitHub <noreply@github.com>2020-12-31 19:08:03 (GMT)
commita6fd0f414c0cb4cd5cc20eb2df3340b31c6f7743 (patch)
treeff4b91c03c527e62efe1c41271b0a3c8395f7ffe /Lib/platform.py
parentdfdca85dfa64e72df385b3a486f85b773fc0f135 (diff)
downloadcpython-a6fd0f414c0cb4cd5cc20eb2df3340b31c6f7743.zip
cpython-a6fd0f414c0cb4cd5cc20eb2df3340b31c6f7743.tar.gz
cpython-a6fd0f414c0cb4cd5cc20eb2df3340b31c6f7743.tar.bz2
bpo-42163, bpo-42189, bpo-42659: Support uname_tuple._replace (for all but processor) (#23010)
* Add test capturing missed expectation with uname_result._replace. * bpo-42163: Override uname_result._make to allow uname_result._replace to work (for everything but 'processor'. * Replace hard-coded length with one derived from the definition. * Add test capturing missed expectation with copy/deepcopy on namedtuple (bpo-42189). * bpo-42189: Exclude processor parameter when constructing uname_result. * In _make, rely on __new__ to strip processor. * Add blurb. * iter is not necessary here. * Rely on num_fields in __new__ * Add test for slices on uname * Add test for copy and pickle. Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> * import pickle * Fix equality test after pickling. * Simply rely on __reduce__ for pickling. Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib/platform.py')
-rwxr-xr-xLib/platform.py17
1 files changed, 15 insertions, 2 deletions
diff --git a/Lib/platform.py b/Lib/platform.py
index 1a07b44..985e12d 100755
--- a/Lib/platform.py
+++ b/Lib/platform.py
@@ -769,7 +769,7 @@ class uname_result(
):
"""
A uname_result that's largely compatible with a
- simple namedtuple except that 'platform' is
+ simple namedtuple except that 'processor' is
resolved late and cached to avoid calling "uname"
except when needed.
"""
@@ -784,12 +784,25 @@ class uname_result(
(self.processor,)
)
+ @classmethod
+ def _make(cls, iterable):
+ # override factory to affect length check
+ num_fields = len(cls._fields)
+ result = cls.__new__(cls, *iterable)
+ if len(result) != num_fields + 1:
+ msg = f'Expected {num_fields} arguments, got {len(result)}'
+ raise TypeError(msg)
+ return result
+
def __getitem__(self, key):
- return tuple(iter(self))[key]
+ return tuple(self)[key]
def __len__(self):
return len(tuple(iter(self)))
+ def __reduce__(self):
+ return uname_result, tuple(self)[:len(self._fields)]
+
_uname_cache = None