From 68386bc0b88eb4b7c9aeb4f753114dc85f8df5b6 Mon Sep 17 00:00:00 2001 From: Larry Hastings Date: Sun, 24 Jun 2012 14:30:41 -0700 Subject: [PATCH] Issue #15164: Change return value of platform.uname() from a plain tuple to a collections.namedtuple. --- Doc/library/platform.rst | 14 ++++++++++---- Lib/platform.py | 18 +++++++++++------- Lib/sysconfig.py | 2 +- Lib/test/test__locale.py | 4 ++-- Lib/test/test_platform.py | 8 +++++++- Misc/NEWS | 5 ++--- 6 files changed, 33 insertions(+), 18 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 938c270cb55..c29811cd877 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -158,14 +158,20 @@ Cross Platform .. function:: uname() - Fairly portable uname interface. Returns a tuple of strings ``(system, node, - release, version, machine, processor)`` identifying the underlying platform. + Fairly portable uname interface. Returns a :func:`~collections.namedtuple` + containing six attributes: :attr:`system`, :attr:`node`, :attr:`release`, + :attr:`version`, :attr:`machine`, and :attr:`processor`. - Note that unlike the :func:`os.uname` function this also returns possible - processor information as additional tuple entry. + Note that this adds a sixth attribute (:attr:`processor`) not present + in the :func:`os.uname` result. Also, the attribute names are different + for the first two attributes; :func:`os.uname` names them + :attr:`sysname` and :attr:`nodename`. Entries which cannot be determined are set to ``''``. + .. versionchanged:: 3.3 + Result changed from a tuple to a namedtuple. + Java Platform ------------- diff --git a/Lib/platform.py b/Lib/platform.py index 3cb7c3e5ee4..b6538227eac 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -111,6 +111,7 @@ __copyright__ = """ __version__ = '1.0.7' +import collections import sys, os, re ### Globals & Constants @@ -1027,6 +1028,9 @@ def architecture(executable=sys.executable,bits='',linkage=''): ### Portable uname() interface +uname_result = collections.namedtuple("uname_result", + "system node release version machine processor") + _uname_cache = None def uname(): @@ -1161,7 +1165,7 @@ def uname(): system = 'Windows' release = 'Vista' - _uname_cache = system,node,release,version,machine,processor + _uname_cache = uname_result(system,node,release,version,machine,processor) return _uname_cache ### Direct interfaces to some of the uname() return values @@ -1173,7 +1177,7 @@ def system(): An empty string is returned if the value cannot be determined. """ - return uname()[0] + return uname().system def node(): @@ -1183,7 +1187,7 @@ def node(): An empty string is returned if the value cannot be determined. """ - return uname()[1] + return uname().node def release(): @@ -1192,7 +1196,7 @@ def release(): An empty string is returned if the value cannot be determined. """ - return uname()[2] + return uname().release def version(): @@ -1201,7 +1205,7 @@ def version(): An empty string is returned if the value cannot be determined. """ - return uname()[3] + return uname().version def machine(): @@ -1210,7 +1214,7 @@ def machine(): An empty string is returned if the value cannot be determined. """ - return uname()[4] + return uname().machine def processor(): @@ -1222,7 +1226,7 @@ def processor(): e.g. NetBSD does this. """ - return uname()[5] + return uname().processor ### Various APIs for extracting information from sys.version diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 2f5d9d0c9cd..2f2fac287b0 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -553,7 +553,7 @@ def get_config_vars(*args): _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) if sys.platform == 'darwin': - kernel_version = os.uname()[2] # Kernel version (8.4.3) + kernel_version = os.uname().release # Kernel version (8.4.3) major_version = int(kernel_version.split('.')[0]) if major_version < 8: diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index f7f1abdab20..4231f37bc96 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -11,8 +11,8 @@ import unittest from platform import uname from test.support import run_unittest -if uname()[0] == "Darwin": - maj, min, mic = [int(part) for part in uname()[2].split(".")] +if uname().system == "Darwin": + maj, min, mic = [int(part) for part in uname().release.split(".")] if (maj, min, mic) < (8, 0, 0): raise unittest.SkipTest("locale support broken for OS X < 10.4") diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index cfe623a8672..6abf44342aa 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -133,6 +133,12 @@ class PlatformTest(unittest.TestCase): def test_uname(self): res = platform.uname() self.assertTrue(any(res)) + self.assertEqual(res[0], res.system) + self.assertEqual(res[1], res.node) + self.assertEqual(res[2], res.release) + self.assertEqual(res[3], res.version) + self.assertEqual(res[4], res.machine) + self.assertEqual(res[5], res.processor) @unittest.skipUnless(sys.platform.startswith('win'), "windows only test") def test_uname_win32_ARCHITEW6432(self): @@ -166,7 +172,7 @@ class PlatformTest(unittest.TestCase): def test_mac_ver(self): res = platform.mac_ver() - if platform.uname()[0] == 'Darwin': + if platform.uname().system == 'Darwin': # We're on a MacOSX system, check that # the right version information is returned fd = os.popen('sw_vers', 'r') diff --git a/Misc/NEWS b/Misc/NEWS index 3591b385ebe..d409b0c3d6d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -59,9 +59,8 @@ Core and Builtins Library ------- -- Support Mageia Linux in the platform module. - -- Issue #11678: Support Arch linux in the platform module. +- Issue #15164: Change return value of platform.uname() from a + plain tuple to a collections.namedtuple. - Issue #15118: Change return value of os.uname() and os.times() from plain tuples to immutable iterable objects with named attributes