[Python-checkins] r59949 - in python/trunk: Doc/library/sys.rst Lib/test/test_sys.py Misc/NEWS Python/sysmodule.c

christian.heimes python-checkins at python.org
Mon Jan 14 04:42:48 CET 2008


Author: christian.heimes
Date: Mon Jan 14 04:42:48 2008
New Revision: 59949

Modified:
   python/trunk/Doc/library/sys.rst
   python/trunk/Lib/test/test_sys.py
   python/trunk/Misc/NEWS
   python/trunk/Python/sysmodule.c
Log:
Applied patch #1816: sys.flags patch

Modified: python/trunk/Doc/library/sys.rst
==============================================================================
--- python/trunk/Doc/library/sys.rst	(original)
+++ python/trunk/Doc/library/sys.rst	Mon Jan 14 04:42:48 2008
@@ -240,6 +240,44 @@
       Use :mod:`atexit` instead.
 
 
+.. data:: flags
+
+   The struct sequence *flags* exposes the status of command line flags. The
+   attributes are read only.
+
+   +------------------------------+------------------------------------------+
+   | attribute                    | flag                                     |
+   +==============================+==========================================+
+   | :const:`debug`               | -d                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`py3k_warning`        | -3                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`division_warning`    | -Q                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`division_new`        | -Qnew                                    |
+   +------------------------------+------------------------------------------+
+   | :const:`inspect`             | -i                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`interactive`         | -i                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`optimize`            | -O or -OO                                |
+   +------------------------------+------------------------------------------+
+   | :const:`dont_write_bytecode` | -B                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`no_site`             | -S                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`ingnore_environment` | -E                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`tabcheck`            | -t or -tt                                |
+   +------------------------------+------------------------------------------+
+   | :const:`verbose`             | -v                                       |
+   +------------------------------+------------------------------------------+
+   | :const:`unicode`             | -U                                       |
+   +------------------------------+------------------------------------------+
+
+   .. versionadded:: 2.6
+
+
 .. data:: float_info
 
    A dict holding information about the float type. It contains low level

Modified: python/trunk/Lib/test/test_sys.py
==============================================================================
--- python/trunk/Lib/test/test_sys.py	(original)
+++ python/trunk/Lib/test/test_sys.py	Mon Jan 14 04:42:48 2008
@@ -352,6 +352,18 @@
         # the test runs under regrtest.
         self.assert_(sys.__stdout__.encoding == sys.__stderr__.encoding)
 
+    def test_sys_flags(self):
+        self.failUnless(sys.flags)
+        attrs = ("debug", "py3k_warning", "division_warning", "division_new",
+                 "inspect", "interactive", "optimize", "dont_write_bytecode",
+                 "no_site", "ingnore_environment", "tabcheck", "verbose",
+                 "unicode")
+        for attr in attrs:
+            self.assert_(hasattr(sys.flags, attr), attr)
+            self.assertEqual(type(getattr(sys.flags, attr)), int, attr)
+        self.assert_(repr(sys.flags))
+
+
 def test_main():
     test.test_support.run_unittest(SysModuleTest)
 

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Mon Jan 14 04:42:48 2008
@@ -12,8 +12,11 @@
 Core and builtins
 -----------------
 
-- Object/structseq.c: Implemented new structseq representation. structseqs
-  like the return value of os.stat are more readable.
+- Patch #1816: Added sys.flags structseq. It exposes the status of most
+  command line arguments and PYTHON* environment variables. 
+
+- Object/structseq.c: Implemented new structseq representation. The patch
+  makes structseqs (e.g. the return value of os.stat) more readable.
 
 - Patch #1700288: added a type attribute cache that caches method accesses,
   resulting in speedups in heavily object-oriented code.

Modified: python/trunk/Python/sysmodule.c
==============================================================================
--- python/trunk/Python/sysmodule.c	(original)
+++ python/trunk/Python/sysmodule.c	Mon Jan 14 04:42:48 2008
@@ -15,6 +15,7 @@
 */
 
 #include "Python.h"
+#include "structseq.h"
 #include "code.h"
 #include "frameobject.h"
 #include "eval.h"
@@ -1045,6 +1046,90 @@
 	return shortbranch;
 }
 
+
+PyDoc_STRVAR(flags__doc__,
+"sys.flags\n\
+\n\
+Flags provided through command line arguments or environment vars.");
+
+static PyTypeObject FlagsType;
+
+static PyStructSequence_Field flags_fields[] = {
+	{"debug",		"-d"},
+	{"py3k_warning",	"-3"},
+	{"division_warning",	"-Q"},
+	{"division_new",	"-Qnew"},
+	{"inspect",		"-i"},
+	{"interactive",		"-i"},
+	{"optimize",		"-O or -OO"},
+	{"dont_write_bytecode",	"-B"},
+	/* {"no_user_site",	"-s"}, */
+	{"no_site",		"-S"},
+	{"ingnore_environment",	"-E"},
+	{"tabcheck",		"-t or -tt"},
+	{"verbose",		"-v"},
+#ifdef RISCOS
+	{"ricos_wimp",		"???"},
+#endif
+	/* {"unbuffered",		"-u"}, */
+	{"unicode",		"-U"},
+	/* {"skip_first",		"-x"}, */
+	{0}
+};
+
+static PyStructSequence_Desc flags_desc = {
+	"sys.flags",	/* name */
+	flags__doc__,	/* doc */
+	flags_fields,	/* fields */
+#ifdef RISCOS
+	14
+#else
+	13
+#endif
+};
+
+static PyObject*
+make_flags(void)
+{
+	int pos = 0;
+	PyObject *seq;
+
+	seq = PyStructSequence_New(&FlagsType);
+	if (seq == NULL)
+		return NULL;
+
+#define SetFlag(flag) \
+	PyStructSequence_SET_ITEM(seq, pos++, PyInt_FromLong(flag))
+
+	SetFlag(Py_DebugFlag);
+	SetFlag(Py_Py3kWarningFlag);
+	SetFlag(Py_DivisionWarningFlag);
+	SetFlag(_Py_QnewFlag);
+	SetFlag(Py_InspectFlag);
+	SetFlag(Py_InteractiveFlag);
+	SetFlag(Py_OptimizeFlag);
+	SetFlag(Py_DontWriteBytecodeFlag);
+	/* SetFlag(Py_NoUserSiteDirectory); */
+	SetFlag(Py_NoSiteFlag);
+	SetFlag(Py_IgnoreEnvironmentFlag);
+	SetFlag(Py_TabcheckFlag);
+	SetFlag(Py_VerboseFlag);
+#ifdef RISCOS
+	SetFlag(Py_RISCOSWimpFlag);
+#endif
+	/* SetFlag(saw_unbuffered_flag); */
+	SetFlag(Py_UnicodeFlag);
+	/* SetFlag(skipfirstline); */
+#undef SetFlag
+
+	if (PyErr_Occurred()) {
+		return NULL;
+	}
+
+	Py_INCREF(seq);
+	return seq;
+}
+
 PyObject *
 _PySys_Init(void)
 {
@@ -1128,9 +1213,9 @@
 	v = Py_BuildValue("(ssz)", "CPython", branch, svn_revision);
 	PyDict_SetItemString(sysdict, "subversion", v);
 	Py_XDECREF(v);
-        PyDict_SetItemString(sysdict, "dont_write_bytecode",
-                             v = PyBool_FromLong(Py_DontWriteBytecodeFlag));
-        Py_XDECREF(v);
+	PyDict_SetItemString(sysdict, "dont_write_bytecode",
+			     v = PyBool_FromLong(Py_DontWriteBytecodeFlag));
+	Py_XDECREF(v);
 	/*
 	 * These release level checks are mutually exclusive and cover
 	 * the field, so don't get too fancy with the pre-processor!
@@ -1211,6 +1296,12 @@
 		PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
 	}
 
+	PyStructSequence_InitType(&FlagsType, &flags_desc);
+	PyDict_SetItemString(sysdict, "flags", make_flags());
+	/* prevent user from creating new instances */
+	FlagsType.tp_init = NULL;
+	FlagsType.tp_new = NULL;
+
 	if (PyErr_Occurred())
 		return NULL;
 	return m;


More information about the Python-checkins mailing list