):
"""
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.
"""
(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
import os
+import copy
+import pickle
import platform
import subprocess
import sys
)
self.assertEqual(tuple(res), expected)
+ def test_uname_replace(self):
+ res = platform.uname()
+ new = res._replace(
+ system='system', node='node', release='release',
+ version='version', machine='machine')
+ self.assertEqual(new.system, 'system')
+ self.assertEqual(new.node, 'node')
+ self.assertEqual(new.release, 'release')
+ self.assertEqual(new.version, 'version')
+ self.assertEqual(new.machine, 'machine')
+ # processor cannot be replaced
+ self.assertEqual(new.processor, res.processor)
+
+ def test_uname_copy(self):
+ uname = platform.uname()
+ self.assertEqual(copy.copy(uname), uname)
+ self.assertEqual(copy.deepcopy(uname), uname)
+
+ def test_uname_pickle(self):
+ orig = platform.uname()
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ with self.subTest(protocol=proto):
+ pickled = pickle.dumps(orig, proto)
+ restored = pickle.loads(pickled)
+ self.assertEqual(restored, orig)
+
+ def test_uname_slices(self):
+ res = platform.uname()
+ expected = tuple(res)
+ self.assertEqual(res[:], expected)
+ self.assertEqual(res[:5], expected[:5])
+
@unittest.skipIf(sys.platform in ['win32', 'OpenVMS'], "uname -p not used")
def test_uname_processor(self):
"""