]> granicus.if.org Git - python/commitdiff
Applied patch #1816: sys.flags patch
authorChristian Heimes <christian@cheimes.de>
Mon, 14 Jan 2008 03:42:48 +0000 (03:42 +0000)
committerChristian Heimes <christian@cheimes.de>
Mon, 14 Jan 2008 03:42:48 +0000 (03:42 +0000)
Doc/library/sys.rst
Lib/test/test_sys.py
Misc/NEWS
Python/sysmodule.c

index a98c5d4054a227dc403fa8caf91962a33220ce6d..d830490b8e5ec34de508416394aed216038df3d9 100644 (file)
@@ -240,6 +240,44 @@ always available.
       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
index d02412fd74e8279e1675a93d2600000abd597b29..66710a0cc3f64d2ae348ab7d97a9cb8200e4ac13 100644 (file)
@@ -352,6 +352,18 @@ class SysModuleTest(unittest.TestCase):
         # 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)
 
index f412016dc635c200c273d039fdf0a7161b2d6c5a..76104c06b1d33f6565a639e604f718561eec069d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,8 +12,11 @@ What's New in Python 2.6 alpha 1?
 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.
index bd551b5abdf0c03c0a359a69d07a786af7ccbd78..cbdda18cf9760a46a7212d760a0d6b5d04db31f2 100644 (file)
@@ -15,6 +15,7 @@ Data members:
 */
 
 #include "Python.h"
+#include "structseq.h"
 #include "code.h"
 #include "frameobject.h"
 #include "eval.h"
@@ -1045,6 +1046,90 @@ Py_SubversionShortBranch()
        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 @@ _PySys_Init(void)
        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 @@ _PySys_Init(void)
                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;