bpo-40275: More lazy imports in test.support (GH-20131)

Make the the following imports lazy in test.support:

* bz2
* gzip
* lzma
* resource
* zlib

The following test.support decorators now need to be called
with parenthesis:

* @support.requires_bz2
* @support.requires_gzip
* @support.requires_lzma
* @support.requires_zlib

For example, "@requires_zlib" becomes "@requires_zlib()".
This commit is contained in:
Hai Shi 2020-05-19 06:02:57 +08:00 committed by GitHub
parent ced4e5c227
commit a3ec3ad9e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 81 additions and 77 deletions

View file

@ -28,31 +28,6 @@ import warnings
from .testresult import get_test_runner
try:
import zlib
except ImportError:
zlib = None
try:
import gzip
except ImportError:
gzip = None
try:
import bz2
except ImportError:
bz2 = None
try:
import lzma
except ImportError:
lzma = None
try:
import resource
except ImportError:
resource = None
__all__ = [
# globals
"PIPE_MAX_SIZE", "verbose", "max_memuse", "use_resources", "failfast",
@ -705,13 +680,33 @@ requires_IEEE_754 = unittest.skipUnless(
float.__getformat__("double").startswith("IEEE"),
"test requires IEEE 754 doubles")
requires_zlib = unittest.skipUnless(zlib, 'requires zlib')
def requires_zlib(reason='requires zlib'):
try:
import zlib
except ImportError:
zlib = None
return unittest.skipUnless(zlib, reason)
requires_gzip = unittest.skipUnless(gzip, 'requires gzip')
def requires_gzip(reason='requires gzip'):
try:
import gzip
except ImportError:
gzip = None
return unittest.skipUnless(gzip, reason)
requires_bz2 = unittest.skipUnless(bz2, 'requires bz2')
def requires_bz2(reason='requires bz2'):
try:
import bz2
except ImportError:
bz2 = None
return unittest.skipUnless(bz2, reason)
requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
def requires_lzma(reason='requires lzma'):
try:
import lzma
except ImportError:
lzma = None
return unittest.skipUnless(lzma, reason)
is_jython = sys.platform.startswith('java')
@ -1062,6 +1057,10 @@ def check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=No
def open_urlresource(url, *args, **kw):
import urllib.request, urllib.parse
try:
import gzip
except ImportError:
gzip = None
check = kw.pop('check', None)
@ -2579,11 +2578,16 @@ class SuppressCrashReport:
self.old_modes[report_type] = old_mode, old_file
else:
if resource is not None:
try:
import resource
self.resource = resource
except ImportError:
self.resource = None
if self.resource is not None:
try:
self.old_value = resource.getrlimit(resource.RLIMIT_CORE)
resource.setrlimit(resource.RLIMIT_CORE,
(0, self.old_value[1]))
self.old_value = self.resource.getrlimit(self.resource.RLIMIT_CORE)
self.resource.setrlimit(self.resource.RLIMIT_CORE,
(0, self.old_value[1]))
except (ValueError, OSError):
pass
@ -2621,9 +2625,9 @@ class SuppressCrashReport:
msvcrt.CrtSetReportMode(report_type, old_mode)
msvcrt.CrtSetReportFile(report_type, old_file)
else:
if resource is not None:
if self.resource is not None:
try:
resource.setrlimit(resource.RLIMIT_CORE, self.old_value)
self.resource.setrlimit(self.resource.RLIMIT_CORE, self.old_value)
except (ValueError, OSError):
pass