mirror of
https://github.com/python/cpython.git
synced 2025-07-27 21:24:32 +00:00
Implement issue #4285, convert sys.version_info to a named
tuple. Patch by Ross Light.
This commit is contained in:
parent
5dde357c9e
commit
81fe09344c
4 changed files with 100 additions and 22 deletions
|
@ -1048,7 +1048,7 @@ maxsize -- the largest supported length of containers.\n\
|
|||
maxunicode -- the largest supported character\n\
|
||||
builtin_module_names -- tuple of module names built into this interpreter\n\
|
||||
version -- the version of this interpreter as a string\n\
|
||||
version_info -- version information as a tuple\n\
|
||||
version_info -- version information as a named tuple\n\
|
||||
hexversion -- version information encoded as a single integer\n\
|
||||
copyright -- copyright notice pertaining to this interpreter\n\
|
||||
platform -- platform identifier\n\
|
||||
|
@ -1279,6 +1279,75 @@ make_flags(void)
|
|||
return seq;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(version_info__doc__,
|
||||
"sys.version_info\n\
|
||||
\n\
|
||||
Version information as a named tuple.");
|
||||
|
||||
static PyTypeObject VersionInfoType = {0, 0, 0, 0, 0, 0};
|
||||
|
||||
static PyStructSequence_Field version_info_fields[] = {
|
||||
{"major", "Major release number"},
|
||||
{"minor", "Minor release number"},
|
||||
{"micro", "Patch release number"},
|
||||
{"releaselevel", "'alpha', 'beta', 'candidate', or 'release'"},
|
||||
{"serial", "Serial release number"},
|
||||
{0}
|
||||
};
|
||||
|
||||
static PyStructSequence_Desc version_info_desc = {
|
||||
"sys.version_info", /* name */
|
||||
version_info__doc__, /* doc */
|
||||
version_info_fields, /* fields */
|
||||
5
|
||||
};
|
||||
|
||||
static PyObject *
|
||||
make_version_info(void)
|
||||
{
|
||||
PyObject *version_info;
|
||||
char *s;
|
||||
int pos = 0;
|
||||
|
||||
version_info = PyStructSequence_New(&VersionInfoType);
|
||||
if (version_info == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* These release level checks are mutually exclusive and cover
|
||||
* the field, so don't get too fancy with the pre-processor!
|
||||
*/
|
||||
#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
|
||||
s = "alpha";
|
||||
#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
|
||||
s = "beta";
|
||||
#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
|
||||
s = "candidate";
|
||||
#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
|
||||
s = "final";
|
||||
#endif
|
||||
|
||||
#define SetIntItem(flag) \
|
||||
PyStructSequence_SET_ITEM(version_info, pos++, PyInt_FromLong(flag))
|
||||
#define SetStrItem(flag) \
|
||||
PyStructSequence_SET_ITEM(version_info, pos++, PyString_FromString(flag))
|
||||
|
||||
SetIntItem(PY_MAJOR_VERSION);
|
||||
SetIntItem(PY_MINOR_VERSION);
|
||||
SetIntItem(PY_MICRO_VERSION);
|
||||
SetStrItem(s);
|
||||
SetIntItem(PY_RELEASE_SERIAL);
|
||||
#undef SetIntItem
|
||||
#undef SetStrItem
|
||||
|
||||
if (PyErr_Occurred()) {
|
||||
Py_CLEAR(version_info);
|
||||
return NULL;
|
||||
}
|
||||
return version_info;
|
||||
}
|
||||
|
||||
PyObject *
|
||||
_PySys_Init(void)
|
||||
{
|
||||
|
@ -1354,25 +1423,6 @@ _PySys_Init(void)
|
|||
svn_revision));
|
||||
SET_SYS_FROM_STRING("dont_write_bytecode",
|
||||
PyBool_FromLong(Py_DontWriteBytecodeFlag));
|
||||
/*
|
||||
* These release level checks are mutually exclusive and cover
|
||||
* the field, so don't get too fancy with the pre-processor!
|
||||
*/
|
||||
#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
|
||||
s = "alpha";
|
||||
#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
|
||||
s = "beta";
|
||||
#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
|
||||
s = "candidate";
|
||||
#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
|
||||
s = "final";
|
||||
#endif
|
||||
|
||||
SET_SYS_FROM_STRING("version_info",
|
||||
Py_BuildValue("iiisi", PY_MAJOR_VERSION,
|
||||
PY_MINOR_VERSION,
|
||||
PY_MICRO_VERSION, s,
|
||||
PY_RELEASE_SERIAL));
|
||||
SET_SYS_FROM_STRING("api_version",
|
||||
PyInt_FromLong(PYTHON_API_VERSION));
|
||||
SET_SYS_FROM_STRING("copyright",
|
||||
|
@ -1429,6 +1479,15 @@ _PySys_Init(void)
|
|||
PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
|
||||
}
|
||||
|
||||
/* version_info */
|
||||
if (VersionInfoType.tp_name == 0)
|
||||
PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
|
||||
SET_SYS_FROM_STRING("version_info", make_version_info());
|
||||
/* prevent user from creating new instances */
|
||||
VersionInfoType.tp_init = NULL;
|
||||
VersionInfoType.tp_new = NULL;
|
||||
|
||||
/* flags */
|
||||
if (FlagsType.tp_name == 0)
|
||||
PyStructSequence_InitType(&FlagsType, &flags_desc);
|
||||
SET_SYS_FROM_STRING("flags", make_flags());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue