Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
0373a106
Kaydet (Commit)
0373a106
authored
Eki 13, 2014
tarafından
Antoine Pitrou
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Issue #17636: Circular imports involving relative imports are now supported.
üst
dfbeb160
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
92 additions
and
3 deletions
+92
-3
__init__.py
Lib/test/test_import/__init__.py
+41
-1
__main__.py
Lib/test/test_import/__main__.py
+4
-0
basic.py
Lib/test/test_import/data/circular_imports/basic.py
+2
-0
basic2.py
Lib/test/test_import/data/circular_imports/basic2.py
+1
-0
indirect.py
Lib/test/test_import/data/circular_imports/indirect.py
+1
-0
rebinding.py
Lib/test/test_import/data/circular_imports/rebinding.py
+4
-0
rebinding2.py
Lib/test/test_import/data/circular_imports/rebinding2.py
+4
-0
subpackage.py
Lib/test/test_import/data/circular_imports/subpackage.py
+3
-0
subpackage2.py
...t/test_import/data/circular_imports/subpkg/subpackage2.py
+3
-0
util.py
Lib/test/test_import/data/circular_imports/subpkg/util.py
+3
-0
util.py
Lib/test/test_import/data/circular_imports/util.py
+3
-0
NEWS
Misc/NEWS
+3
-0
ceval.c
Python/ceval.c
+20
-2
No files found.
Lib/test/test_import.py
→
Lib/test/test_import
/__init__
.py
Dosyayı görüntüle @
0373a106
...
...
@@ -568,7 +568,7 @@ class RelativeImportTests(unittest.TestCase):
def
test_relimport_star
(
self
):
# This will import * from .test_import.
from
.
import
relimport
from
.
.
import
relimport
self
.
assertTrue
(
hasattr
(
relimport
,
"RelativeImportTests"
))
def
test_issue3221
(
self
):
...
...
@@ -1068,6 +1068,46 @@ class ImportTracebackTests(unittest.TestCase):
__isolated
=
False
)
class
CircularImportTests
(
unittest
.
TestCase
):
"""See the docstrings of the modules being imported for the purpose of the
test."""
def
tearDown
(
self
):
"""Make sure no modules pre-exist in sys.modules which are being used to
test."""
for
key
in
list
(
sys
.
modules
.
keys
()):
if
key
.
startswith
(
'test.test_import.data.circular_imports'
):
del
sys
.
modules
[
key
]
def
test_direct
(
self
):
try
:
import
test.test_import.data.circular_imports.basic
except
ImportError
:
self
.
fail
(
'circular import through relative imports failed'
)
def
test_indirect
(
self
):
try
:
import
test.test_import.data.circular_imports.indirect
except
ImportError
:
self
.
fail
(
'relative import in module contributing to circular '
'import failed'
)
def
test_subpackage
(
self
):
try
:
import
test.test_import.data.circular_imports.subpackage
except
ImportError
:
self
.
fail
(
'circular import involving a subpackage failed'
)
def
test_rebinding
(
self
):
try
:
import
test.test_import.data.circular_imports.rebinding
as
rebinding
except
ImportError
:
self
.
fail
(
'circular import with rebinding of module attribute failed'
)
from
test.test_import.data.circular_imports.subpkg
import
util
self
.
assertIs
(
util
.
util
,
rebinding
.
util
)
if
__name__
==
'__main__'
:
# Test needs to be a package, so we can do relative imports.
unittest
.
main
()
Lib/test/test_import/__main__.py
0 → 100644
Dosyayı görüntüle @
0373a106
import
unittest
unittest
.
main
(
'test.test_import'
)
\ No newline at end of file
Lib/test/test_import/data/circular_imports/basic.py
0 → 100644
Dosyayı görüntüle @
0373a106
"""Circular imports through direct, relative imports."""
from
.
import
basic2
Lib/test/test_import/data/circular_imports/basic2.py
0 → 100644
Dosyayı görüntüle @
0373a106
from
.
import
basic
Lib/test/test_import/data/circular_imports/indirect.py
0 → 100644
Dosyayı görüntüle @
0373a106
from
.
import
basic
,
basic2
Lib/test/test_import/data/circular_imports/rebinding.py
0 → 100644
Dosyayı görüntüle @
0373a106
"""Test the binding of names when a circular import shares the same name as an
attribute."""
from
.rebinding2
import
util
\ No newline at end of file
Lib/test/test_import/data/circular_imports/rebinding2.py
0 → 100644
Dosyayı görüntüle @
0373a106
from
.subpkg
import
util
from
.
import
rebinding
util
=
util
.
util
\ No newline at end of file
Lib/test/test_import/data/circular_imports/subpackage.py
0 → 100644
Dosyayı görüntüle @
0373a106
"""Circular import involving a sub-package."""
from
.subpkg
import
subpackage2
\ No newline at end of file
Lib/test/test_import/data/circular_imports/subpkg/subpackage2.py
0 → 100644
Dosyayı görüntüle @
0373a106
#from .util import util
from
..
import
subpackage
\ No newline at end of file
Lib/test/test_import/data/circular_imports/subpkg/util.py
0 → 100644
Dosyayı görüntüle @
0373a106
def
util
():
pass
\ No newline at end of file
Lib/test/test_import/data/circular_imports/util.py
0 → 100644
Dosyayı görüntüle @
0373a106
def
util
():
pass
\ No newline at end of file
Misc/NEWS
Dosyayı görüntüle @
0373a106
...
...
@@ -10,6 +10,9 @@ Release date: TBA
Core and Builtins
-----------------
- Issue #17636: Circular imports involving relative imports are now
supported.
- Issue #22604: Fix assertion error in debug mode when dividing a complex
number by (nan+0j).
...
...
Python/ceval.c
Dosyayı görüntüle @
0373a106
...
...
@@ -4693,11 +4693,29 @@ static PyObject *
import_from
(
PyObject
*
v
,
PyObject
*
name
)
{
PyObject
*
x
;
_Py_IDENTIFIER
(
__name__
);
PyObject
*
fullmodname
,
*
pkgname
;
x
=
PyObject_GetAttr
(
v
,
name
);
if
(
x
==
NULL
&&
PyErr_ExceptionMatches
(
PyExc_AttributeError
))
{
if
(
x
!=
NULL
||
!
PyErr_ExceptionMatches
(
PyExc_AttributeError
))
return
x
;
/* Issue #17636: in case this failed because of a circular relative
import, try to fallback on reading the module directly from
sys.modules. */
PyErr_Clear
();
pkgname
=
_PyObject_GetAttrId
(
v
,
&
PyId___name__
);
if
(
pkgname
==
NULL
)
return
NULL
;
fullmodname
=
PyUnicode_FromFormat
(
"%U.%U"
,
pkgname
,
name
);
Py_DECREF
(
pkgname
);
if
(
fullmodname
==
NULL
)
return
NULL
;
x
=
PyDict_GetItem
(
PyImport_GetModuleDict
(),
fullmodname
);
if
(
x
==
NULL
)
PyErr_Format
(
PyExc_ImportError
,
"cannot import name %R"
,
name
);
}
else
Py_INCREF
(
x
);
Py_DECREF
(
fullmodname
);
return
x
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment