Index: Python/sysmodule.c =================================================================== --- Python/sysmodule.c (Revision 59932) +++ Python/sysmodule.c (Arbeitskopie) @@ -15,6 +15,7 @@ */ #include "Python.h" +#include "structseq.h" #include "code.h" #include "frameobject.h" #include "eval.h" @@ -1045,6 +1046,112 @@ 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 = { + "_Flags", /* name */ + flags__doc__, /* doc */ + flags_fields, /* fields */ +#ifdef RISCOS + 14 +#else + 13 +#endif +}; + +static PyObject * +flags_repr(PyObject *self) +{ + PyObject *repr, *sl, *slrepr; + char *crepr; + + if ((sl = PySequence_GetSlice(self, 0, -1)) == NULL) + return NULL; + slrepr = PyObject_Repr(sl); + Py_DECREF(sl); + if (slrepr == NULL) + return NULL; + if ((crepr = PyString_AsString(slrepr)) == NULL) { + Py_DECREF(slrepr); + return NULL; + } + repr = PyString_FromFormat("", crepr); + Py_DECREF(slrepr); + return repr; +} + +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()) { + Py_DECREF(seq); + return NULL; + } + + return seq; +#undef AddStringIf +} + PyObject * _PySys_Init(void) { @@ -1128,9 +1235,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 +1318,14 @@ PyDict_SetItemString(sysdict, "warnoptions", warnoptions); } + PyStructSequence_InitType(&FlagsType, &flags_desc); + FlagsType.tp_repr = flags_repr; + PyDict_SetItemString(sysdict, "flags", v = make_flags()); + Py_XDECREF(v); + /* prevent user from creating new instances */ + FlagsType.tp_init = NULL; + FlagsType.tp_new = NULL; + if (PyErr_Occurred()) return NULL; return m; Index: Lib/test/test_sys.py =================================================================== --- Lib/test/test_sys.py (Revision 59932) +++ Lib/test/test_sys.py (Arbeitskopie) @@ -352,6 +352,17 @@ # 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) + + def test_main(): test.test_support.run_unittest(SysModuleTest) Index: Doc/library/sys.rst =================================================================== --- Doc/library/sys.rst (Revision 59932) +++ Doc/library/sys.rst (Arbeitskopie) @@ -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