Issue #15164: Change return value of platform.uname() from a
authorLarry Hastings <larry@hastings.org>
Sun, 24 Jun 2012 21:30:41 +0000 (14:30 -0700)
committerLarry Hastings <larry@hastings.org>
Sun, 24 Jun 2012 21:30:41 +0000 (14:30 -0700)
plain tuple to a collections.namedtuple.

Doc/library/platform.rst
Lib/platform.py
Lib/sysconfig.py
Lib/test/test__locale.py
Lib/test/test_platform.py
Misc/NEWS

index 938c270cb55741fba69eb4eda9e548b1e90d8b44..c29811cd8773a68845a92a23bc510de05f6f4f66 100644 (file)
@@ -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
 -------------
index 3cb7c3e5ee4b0ec64a0458d96e8f0ff7c33fe272..b6538227eac20479d3ded43cab2371fbe0bc6bf8 100755 (executable)
@@ -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
 
index 2f5d9d0c9cd230add1dbcd0ea67999441b36f674..2f2fac287b0394fad0e39bf0a76779622384122f 100644 (file)
@@ -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:
index f7f1abdab2088b930a1914f5af736e14e88ead8a..4231f37bc9635ecb4064eeebf41e4920d13e4e9b 100644 (file)
@@ -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")
 
index cfe623a8672c719c3dbbd5f2ad264596bc358a2b..6abf44342aa221f9c74bbaa28ccd14beceac2353 100644 (file)
@@ -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')
index 3591b385ebe3ae5a0fd450def7ddd3bb9af1c92d..d409b0c3d6d5d979537963ac52cda1c93f26ce44 100644 (file)
--- 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