Applied patch #1816: sys.flags patch

This commit is contained in:
Christian Heimes 2008-01-14 03:42:48 +00:00
parent 620fbe6632
commit f31b69f9db
4 changed files with 149 additions and 5 deletions

View 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

View 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)

View File

@ -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.

View 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)
{
@ -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;