summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/sys.rst38
-rw-r--r--Lib/test/test_sys.py12
-rw-r--r--Misc/NEWS7
-rw-r--r--Python/sysmodule.c97
4 files changed, 149 insertions, 5 deletions
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index a98c5d4..d830490 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -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
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index d02412f..66710a0 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -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)
diff --git a/Misc/NEWS b/Misc/NEWS
index f412016..76104c0 100644
--- 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.
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index bd551b5..cbdda18 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -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;