diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2020-12-31 19:08:03 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-31 19:08:03 (GMT) |
commit | a6fd0f414c0cb4cd5cc20eb2df3340b31c6f7743 (patch) | |
tree | ff4b91c03c527e62efe1c41271b0a3c8395f7ffe /Lib/platform.py | |
parent | dfdca85dfa64e72df385b3a486f85b773fc0f135 (diff) | |
download | cpython-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-x | Lib/platform.py | 17 |
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 |