Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

gh-112660: Do not clear arbitrary errors on import#112661

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
Show file tree
Hide file tree
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
Do not clear unexpected errors during formatting error messages for
ImportError and AttributeError for modules.
57 changes: 25 additions & 32 deletionsObjects/moduleobject.c
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -749,27 +749,20 @@ module_repr(PyModuleObject *m)
}

/* Check if the "_initializing" attribute of the module spec is set to true.
Clear the exception and return 0 if spec is NULL.
*/
int
_PyModuleSpec_IsInitializing(PyObject *spec)
{
if (spec != NULL) {
PyObject *value;
int ok = PyObject_GetOptionalAttr(spec, &_Py_ID(_initializing), &value);
if (ok == 0) {
return 0;
}
if (value != NULL) {
int initializing = PyObject_IsTrue(value);
Py_DECREF(value);
if (initializing >= 0) {
return initializing;
}
}
if (spec == NULL) {
return 0;
}
PyErr_Clear();
return 0;
PyObject *value;
int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_initializing), &value);
if (rc > 0) {
rc = PyObject_IsTrue(value);
Py_DECREF(value);
}
return rc;
}

/* Check if the submodule name is in the "_uninitialized_submodules" attribute
Expand All@@ -782,17 +775,13 @@ _PyModuleSpec_IsUninitializedSubmodule(PyObject *spec, PyObject *name)
return 0;
}

PyObject *value = PyObject_GetAttr(spec, &_Py_ID(_uninitialized_submodules));
if (value == NULL) {
return 0;
PyObject *value;
int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_uninitialized_submodules), &value);
if (rc > 0) {
rc = PySequence_Contains(value, name);
Py_DECREF(value);
}

int is_uninitialized = PySequence_Contains(value, name);
Py_DECREF(value);
if (is_uninitialized == -1) {
return 0;
}
return is_uninitialized;
return rc;
}

PyObject*
Expand DownExpand Up@@ -840,23 +829,27 @@ _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress)
return NULL;
}
if (suppress != 1) {
if (_PyModuleSpec_IsInitializing(spec)) {
int rc = _PyModuleSpec_IsInitializing(spec);
if (rc > 0) {
PyErr_Format(PyExc_AttributeError,
"partially initialized "
"module '%U' has no attribute '%U' "
"(most likely due to a circular import)",
mod_name, name);
}
else if (_PyModuleSpec_IsUninitializedSubmodule(spec, name)) {
PyErr_Format(PyExc_AttributeError,
else if (rc == 0) {
rc = _PyModuleSpec_IsUninitializedSubmodule(spec, name);
if (rc > 0) {
PyErr_Format(PyExc_AttributeError,
"cannot access submodule '%U' of module '%U' "
"(most likely due to a circular import)",
name, mod_name);
}
else {
PyErr_Format(PyExc_AttributeError,
}
else if (rc == 0) {
PyErr_Format(PyExc_AttributeError,
"module '%U' has no attribute '%U'",
mod_name, name);
}
}
}
Py_XDECREF(spec);
Expand Down
46 changes: 31 additions & 15 deletionsPython/ceval.c
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -2614,11 +2614,10 @@ import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
/* Issue #17636: in case this failed because of a circular relative
import, try to fallback on reading the module directly from
sys.modules. */
pkgname = PyObject_GetAttr(v, &_Py_ID(__name__));
if (pkgname == NULL) {
goto error;
if (PyObject_GetOptionalAttr(v, &_Py_ID(__name__), &pkgname) < 0) {
return NULL;
}
if (!PyUnicode_Check(pkgname)) {
if (pkgname == NULL ||!PyUnicode_Check(pkgname)) {
Py_CLEAR(pkgname);
goto error;
}
Expand All@@ -2635,42 +2634,59 @@ import_from(PyThreadState *tstate, PyObject *v, PyObject *name)
Py_DECREF(pkgname);
return x;
error:
pkgpath = PyModule_GetFilenameObject(v);
if (pkgname == NULL) {
pkgname_or_unknown = PyUnicode_FromString("<unknown module name>");
if (pkgname_or_unknown == NULL) {
Py_XDECREF(pkgpath);
return NULL;
}
} else {
pkgname_or_unknown = pkgname;
}

pkgpath = NULL;
if (PyModule_Check(v)) {
pkgpath = PyModule_GetFilenameObject(v);
if (pkgpath == NULL) {
if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Py_DECREF(pkgname_or_unknown);
return NULL;
}
// module filename missing
_PyErr_Clear(tstate);
}
}
if (pkgpath == NULL || !PyUnicode_Check(pkgpath)) {
_PyErr_Clear(tstate);
Py_CLEAR(pkgpath);
errmsg = PyUnicode_FromFormat(
"cannot import name %R from %R (unknown location)",
name, pkgname_or_unknown
);
/* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
_PyErr_SetImportErrorWithNameFrom(errmsg, pkgname, NULL, name);
}
else {
PyObject *spec = PyObject_GetAttr(v, &_Py_ID(__spec__));
PyObject *spec;
int rc = PyObject_GetOptionalAttr(v, &_Py_ID(__spec__), &spec);
if (rc > 0) {
rc = _PyModuleSpec_IsInitializing(spec);
Py_DECREF(spec);
}
if (rc < 0) {
Py_DECREF(pkgname_or_unknown);
Py_DECREF(pkgpath);
return NULL;
}
const char *fmt =
_PyModuleSpec_IsInitializing(spec) ?
rc ?
"cannot import name %R from partially initialized module %R "
"(most likely due to a circular import) (%S)" :
"cannot import name %R from %R (%S)";
Py_XDECREF(spec);

errmsg = PyUnicode_FromFormat(fmt, name, pkgname_or_unknown, pkgpath);
/* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
_PyErr_SetImportErrorWithNameFrom(errmsg, pkgname, pkgpath, name);
}
/* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */
_PyErr_SetImportErrorWithNameFrom(errmsg, pkgname, pkgpath, name);

Py_XDECREF(errmsg);
Py_XDECREF(pkgname_or_unknown);
Py_DECREF(pkgname_or_unknown);
Py_XDECREF(pkgpath);
return NULL;
}
Expand Down
25 changes: 14 additions & 11 deletionsPython/import.c
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -252,18 +252,21 @@ import_ensure_initialized(PyInterpreterState *interp, PyObject *mod, PyObject *n
NOTE: because of this, initializing must be set *before*
stuffing the new module in sys.modules.
*/
spec = PyObject_GetAttr(mod, &_Py_ID(__spec__));
int busy = _PyModuleSpec_IsInitializing(spec);
Py_XDECREF(spec);
if (busy) {
/* Wait until module is done importing. */
PyObject *value = PyObject_CallMethodOneArg(
IMPORTLIB(interp), &_Py_ID(_lock_unlock_module), name);
if (value == NULL) {
return -1;
}
Py_DECREF(value);
int rc = PyObject_GetOptionalAttr(mod, &_Py_ID(__spec__), &spec);
if (rc > 0) {
rc = _PyModuleSpec_IsInitializing(spec);
Py_DECREF(spec);
}
if (rc <= 0) {
return rc;
}
/* Wait until module is done importing. */
PyObject *value = PyObject_CallMethodOneArg(
IMPORTLIB(interp), &_Py_ID(_lock_unlock_module), name);
if (value == NULL) {
return -1;
}
Py_DECREF(value);
return 0;
}

Expand Down

[8]ページ先頭

©2009-2025 Movatter.jp