Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c8f51fd

Browse files
committed
compile re expressions only if required
1 parent a4967d9 commit c8f51fd

1 file changed

Lines changed: 34 additions & 31 deletions

File tree

Lib/platform.py

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,6 @@ def _comparable_version(version):
152152

153153
### Platform specific APIs
154154

155-
_libc_search = re.compile(b'(__libc_init)'
156-
b'|'
157-
b'(GLIBC_([0-9.]+))'
158-
b'|'
159-
br'(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)', re.ASCII)
160155

161156
def libc_ver(executable=None, lib='', version='', chunksize=16384):
162157

@@ -190,6 +185,12 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384):
190185
# sys.executable is not set.
191186
return lib, version
192187

188+
_libc_search = re.compile(b'(__libc_init)'
189+
b'|'
190+
b'(GLIBC_([0-9.]+))'
191+
b'|'
192+
br'(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)', re.ASCII)
193+
193194
V = _comparable_version
194195
# We use os.path.realpath()
195196
# here to work around problems with Cygwin not being
@@ -247,9 +248,6 @@ def _norm_version(version, build=''):
247248
version = '.'.join(strings[:3])
248249
return version
249250

250-
_ver_output = re.compile(r'(?:([\w ]+) ([\w.]+) '
251-
r'.*'
252-
r'\[.* ([\d.]+)\])')
253251

254252
# Examples of VER command output:
255253
#
@@ -295,6 +293,10 @@ def _syscmd_ver(system='', release='', version='',
295293
else:
296294
return system, release, version
297295

296+
_ver_output = re.compile(r'(?:([\w ]+) ([\w.]+) '
297+
r'.*'
298+
r'\[.* ([\d.]+)\])')
299+
298300
# Parse the output
299301
info = info.strip()
300302
m = _ver_output.match(info)
@@ -1033,18 +1035,6 @@ def processor():
10331035

10341036
### Various APIs for extracting information from sys.version
10351037

1036-
_sys_version_parser = re.compile(
1037-
r'([\w.+]+)\s*' # "version<space>"
1038-
r'\(#?([^,]+)' # "(#buildno"
1039-
r'(?:,\s*([\w ]*)' # ", builddate"
1040-
r'(?:,\s*([\w :]*))?)?\)\s*' # ", buildtime)<space>"
1041-
r'\[([^\]]+)\]?', re.ASCII) # "[compiler]"
1042-
1043-
_pypy_sys_version_parser = re.compile(
1044-
r'([\w.+]+)\s*'
1045-
r'\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*'
1046-
r'\[PyPy [^\]]+\]?')
1047-
10481038
_sys_version_cache = {}
10491039

10501040
def _sys_version(sys_version=None):
@@ -1076,6 +1066,13 @@ def _sys_version(sys_version=None):
10761066
if result is not None:
10771067
return result
10781068

1069+
_sys_version_parser = re.compile(
1070+
r'([\w.+]+)\s*' # "version<space>"
1071+
r'\(#?([^,]+)' # "(#buildno"
1072+
r'(?:,\s*([\w ]*)' # ", builddate"
1073+
r'(?:,\s*([\w :]*))?)?\)\s*' # ", buildtime)<space>"
1074+
r'\[([^\]]+)\]?', re.ASCII) # "[compiler]"
1075+
10791076
if sys.platform.startswith('java'):
10801077
# Jython
10811078
name = 'Jython'
@@ -1091,6 +1088,11 @@ def _sys_version(sys_version=None):
10911088

10921089
elif "PyPy" in sys_version:
10931090
# PyPy
1091+
_pypy_sys_version_parser = re.compile(
1092+
r'([\w.+]+)\s*'
1093+
r'\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*'
1094+
r'\[PyPy [^\]]+\]?')
1095+
10941096
name = "PyPy"
10951097
match = _pypy_sys_version_parser.match(sys_version)
10961098
if match is None:
@@ -1290,17 +1292,6 @@ def platform(aliased=False, terse=False):
12901292
### freedesktop.org os-release standard
12911293
# https://www.freedesktop.org/software/systemd/man/os-release.html
12921294

1293-
# NAME=value with optional quotes (' or "). The regular expression is less
1294-
# strict than shell lexer, but that's ok.
1295-
_os_release_line = re.compile(
1296-
"^(?P<name>[a-zA-Z0-9_]+)=(?P<quote>[\"\']?)(?P<value>.*)(?P=quote)$"
1297-
)
1298-
# unescape five special characters mentioned in the standard
1299-
_os_release_unescape = re.compile(r"\\([\\\$\"\'`])")
1300-
# /etc takes precedence over /usr/lib
1301-
_os_release_candidates = ("/etc/os-release", "/usr/lib/os-release")
1302-
_os_release_cache = None
1303-
13041295

13051296
def _parse_os_release(lines):
13061297
# These fields are mandatory fields with well-known defaults
@@ -1311,6 +1302,14 @@ def _parse_os_release(lines):
13111302
"PRETTY_NAME": "Linux",
13121303
}
13131304

1305+
# NAME=value with optional quotes (' or "). The regular expression is less
1306+
# strict than shell lexer, but that's ok.
1307+
_os_release_line = re.compile(
1308+
"^(?P<name>[a-zA-Z0-9_]+)=(?P<quote>[\"\']?)(?P<value>.*)(?P=quote)$"
1309+
)
1310+
# unescape five special characters mentioned in the standard
1311+
_os_release_unescape = re.compile(r"\\([\\\$\"\'`])")
1312+
13141313
for line in lines:
13151314
mo = _os_release_line.match(line)
13161315
if mo is not None:
@@ -1326,6 +1325,10 @@ def freedesktop_os_release():
13261325
"""
13271326
global _os_release_cache
13281327

1328+
# /etc takes precedence over /usr/lib
1329+
_os_release_candidates = ("/etc/os-release", "/usr/lib/os-release")
1330+
_os_release_cache = None
1331+
13291332
if _os_release_cache is None:
13301333
errno = None
13311334
for candidate in _os_release_candidates:

0 commit comments

Comments
 (0)