Movatterモバイル変換


[0]ホーム

URL:


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

Sign up
Appearance settings

Commita6fd0f4

Browse 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 parentdfdca85 commita6fd0f4

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

‎Lib/platform.py

Lines 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+
iflen(result)!=num_fields+1:
793+
msg=f'Expected{num_fields} arguments, got{len(result)}'
794+
raiseTypeError(msg)
795+
returnresult
796+
787797
def__getitem__(self,key):
788-
returntuple(iter(self))[key]
798+
returntuple(self)[key]
789799

790800
def__len__(self):
791801
returnlen(tuple(iter(self)))
792802

803+
def__reduce__(self):
804+
returnuname_result,tuple(self)[:len(self._fields)]
805+
793806

794807
_uname_cache=None
795808

‎Lib/test/test_platform.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
importos
2+
importcopy
3+
importpickle
24
importplatform
35
importsubprocess
46
importsys
@@ -234,6 +236,38 @@ def test_uname_cast_to_tuple(self):
234236
)
235237
self.assertEqual(tuple(res),expected)
236238

239+
deftest_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+
deftest_uname_copy(self):
253+
uname=platform.uname()
254+
self.assertEqual(copy.copy(uname),uname)
255+
self.assertEqual(copy.deepcopy(uname),uname)
256+
257+
deftest_uname_pickle(self):
258+
orig=platform.uname()
259+
forprotoinrange(pickle.HIGHEST_PROTOCOL+1):
260+
withself.subTest(protocol=proto):
261+
pickled=pickle.dumps(orig,proto)
262+
restored=pickle.loads(pickled)
263+
self.assertEqual(restored,orig)
264+
265+
deftest_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.platformin ['win32','OpenVMS'],"uname -p not used")
238272
deftest_uname_processor(self):
239273
"""
Lines 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)

[8]ページ先頭

©2009-2025 Movatter.jp