Applied patch #1816: sys.flags patch
This commit is contained in:
parent
620fbe6632
commit
f31b69f9db
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue