Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a6fd0f4

Browse filesBrowse files
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>
1 parent dfdca85 commit a6fd0f4
Copy full SHA for a6fd0f4

File tree

3 files changed

+50
-2
lines changed
Filter options

3 files changed

+50
-2
lines changed

‎Lib/platform.py

Copy file name to clipboardExpand all lines: Lib/platform.py
+15-2Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ class uname_result(
769769
):
770770
"""
771771
A uname_result that's largely compatible with a
772-
simple namedtuple except that 'platform' is
772+
simple namedtuple except that 'processor' is
773773
resolved late and cached to avoid calling "uname"
774774
except when needed.
775775
"""
@@ -784,12 +784,25 @@ def __iter__(self):
784784
(self.processor,)
785785
)
786786

787+
@classmethod
788+
def _make(cls, iterable):
789+
# override factory to affect length check
790+
num_fields = len(cls._fields)
791+
result = cls.__new__(cls, *iterable)
792+
if len(result) != num_fields + 1:
793+
msg = f'Expected {num_fields} arguments, got {len(result)}'
794+
raise TypeError(msg)
795+
return result
796+
787797
def __getitem__(self, key):
788-
return tuple(iter(self))[key]
798+
return tuple(self)[key]
789799

790800
def __len__(self):
791801
return len(tuple(iter(self)))
792802

803+
def __reduce__(self):
804+
return uname_result, tuple(self)[:len(self._fields)]
805+
793806

794807
_uname_cache = None
795808

‎Lib/test/test_platform.py

Copy file name to clipboardExpand all lines: Lib/test/test_platform.py
+34Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import os
2+
import copy
3+
import pickle
24
import platform
35
import subprocess
46
import sys
@@ -234,6 +236,38 @@ def test_uname_cast_to_tuple(self):
234236
)
235237
self.assertEqual(tuple(res), expected)
236238

239+
def test_uname_replace(self):
240+
res = platform.uname()
241+
new = res._replace(
242+
system='system', node='node', release='release',
243+
version='version', machine='machine')
244+
self.assertEqual(new.system, 'system')
245+
self.assertEqual(new.node, 'node')
246+
self.assertEqual(new.release, 'release')
247+
self.assertEqual(new.version, 'version')
248+
self.assertEqual(new.machine, 'machine')
249+
# processor cannot be replaced
250+
self.assertEqual(new.processor, res.processor)
251+
252+
def test_uname_copy(self):
253+
uname = platform.uname()
254+
self.assertEqual(copy.copy(uname), uname)
255+
self.assertEqual(copy.deepcopy(uname), uname)
256+
257+
def test_uname_pickle(self):
258+
orig = platform.uname()
259+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
260+
with self.subTest(protocol=proto):
261+
pickled = pickle.dumps(orig, proto)
262+
restored = pickle.loads(pickled)
263+
self.assertEqual(restored, orig)
264+
265+
def test_uname_slices(self):
266+
res = platform.uname()
267+
expected = tuple(res)
268+
self.assertEqual(res[:], expected)
269+
self.assertEqual(res[:5], expected[:5])
270+
237271
@unittest.skipIf(sys.platform in ['win32', 'OpenVMS'], "uname -p not used")
238272
def test_uname_processor(self):
239273
"""
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Restore compatibility for ``uname_result`` around deepcopy and _replace.

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.