diff options
-rw-r--r-- | Doc/library/sys.rst | 38 | ||||
-rw-r--r-- | Lib/test/test_sys.py | 12 | ||||
-rw-r--r-- | Misc/NEWS | 7 | ||||
-rw-r--r-- | Python/sysmodule.c | 97 |
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) @@ -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; |