Skip to content

Commit 612ac28

Browse files
authored
gh-122549: Add platform.invalidate_caches() (#122547)
Allow to invalidate platform's cached results.
1 parent 08f98f4 commit 612ac28

File tree

5 files changed

+67
-1
lines changed

5 files changed

+67
-1
lines changed

Doc/library/platform.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,3 +359,15 @@ Android Platform
359359
<https://storage.googleapis.com/play_public/supported_devices.html>`__.
360360

361361
.. versionadded:: 3.13
362+
363+
364+
Miscellaneous
365+
-------------
366+
367+
.. function:: invalidate_caches()
368+
369+
Clear out the internal cache of information, such as the :func:`uname`.
370+
This is typically useful when the platform's :func:`node` is changed
371+
by an external process and one needs to retrieve the updated value.
372+
373+
.. versionadded:: 3.14

Doc/whatsnew/3.14.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,14 @@ pathlib
454454
(Contributed by Barney Gale in :gh:`125413`.)
455455

456456

457+
platform
458+
--------
459+
460+
* Add :func:`platform.invalidate_caches` to invalidate the cached results.
461+
462+
(Contributed by Bénédikt Tran in :gh:`122549`.)
463+
464+
457465
pdb
458466
---
459467

Lib/platform.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#
3232
# <see CVS and SVN checkin messages for history>
3333
#
34+
# 1.0.9 - added invalidate_caches() function to invalidate cached values
3435
# 1.0.8 - changed Windows support to read version from kernel32.dll
3536
# 1.0.7 - added DEV_NULL
3637
# 1.0.6 - added linux_distribution()
@@ -109,7 +110,7 @@
109110
110111
"""
111112

112-
__version__ = '1.0.8'
113+
__version__ = '1.0.9'
113114

114115
import collections
115116
import os
@@ -1441,6 +1442,18 @@ def freedesktop_os_release():
14411442
return _os_release_cache.copy()
14421443

14431444

1445+
def invalidate_caches():
1446+
"""Invalidate the cached results."""
1447+
global _uname_cache
1448+
_uname_cache = None
1449+
1450+
global _os_release_cache
1451+
_os_release_cache = None
1452+
1453+
_sys_version_cache.clear()
1454+
_platform_cache.clear()
1455+
1456+
14441457
### Command line interface
14451458

14461459
if __name__ == '__main__':

Lib/test/test_platform.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,38 @@ def clear_caches(self):
8383
platform._uname_cache = None
8484
platform._os_release_cache = None
8585

86+
def test_invalidate_caches(self):
87+
self.clear_caches()
88+
89+
self.assertDictEqual(platform._platform_cache, {})
90+
self.assertDictEqual(platform._sys_version_cache, {})
91+
self.assertIsNone(platform._uname_cache)
92+
self.assertIsNone(platform._os_release_cache)
93+
94+
# fill the cached entries (some have side effects on others)
95+
platform.platform() # for platform._platform_cache
96+
platform.python_implementation() # for platform._sys_version_cache
97+
platform.uname() # for platform._uname_cache
98+
99+
# check that the cache are filled
100+
self.assertNotEqual(platform._platform_cache, {})
101+
self.assertNotEqual(platform._sys_version_cache, {})
102+
self.assertIsNotNone(platform._uname_cache)
103+
104+
try:
105+
platform.freedesktop_os_release()
106+
except OSError:
107+
self.assertIsNone(platform._os_release_cache)
108+
else:
109+
self.assertIsNotNone(platform._os_release_cache)
110+
111+
with self.subTest('clear platform caches'):
112+
platform.invalidate_caches()
113+
self.assertDictEqual(platform._platform_cache, {})
114+
self.assertDictEqual(platform._sys_version_cache, {})
115+
self.assertIsNone(platform._uname_cache)
116+
self.assertIsNone(platform._os_release_cache)
117+
86118
def test_architecture(self):
87119
res = platform.architecture()
88120

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add :func:`platform.invalidate_caches` to invalidate cached results.

0 commit comments

Comments
 (0)