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

Commitf186557

Browse files
gh-103977: compile re expressions in platform.py only if required (#103981)
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
1 parented95e8c commitf186557

File tree

2 files changed

+40
-36
lines changed

2 files changed

+40
-36
lines changed

‎Lib/platform.py‎

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@
136136
'pl':200,'p':200,
137137
}
138138

139-
_component_re=re.compile(r'([0-9]+|[._+-])')
140139

141140
def_comparable_version(version):
141+
component_re=re.compile(r'([0-9]+|[._+-])')
142142
result= []
143-
forvin_component_re.split(version):
143+
forvincomponent_re.split(version):
144144
ifvnotin'._+-':
145145
try:
146146
v=int(v,10)
@@ -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
deflibc_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
returnlib,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
@@ -200,7 +201,7 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384):
200201
pos=0
201202
whilepos<len(binary):
202203
ifb'libc'inbinaryorb'GLIBC'inbinary:
203-
m=_libc_search.search(binary,pos)
204+
m=libc_search.search(binary,pos)
204205
else:
205206
m=None
206207
ifnotmorm.end()==len(binary):
@@ -247,9 +248,6 @@ def _norm_version(version, build=''):
247248
version='.'.join(strings[:3])
248249
returnversion
249250

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

254252
# Examples of VER command output:
255253
#
@@ -295,9 +293,13 @@ def _syscmd_ver(system='', release='', version='',
295293
else:
296294
returnsystem,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()
300-
m=_ver_output.match(info)
302+
m=ver_output.match(info)
301303
ifmisnotNone:
302304
system,release,version=m.groups()
303305
# Strip trailing dots from version and release
@@ -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,10 +1066,17 @@ def _sys_version(sys_version=None):
10761066
ifresultisnotNone:
10771067
returnresult
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
ifsys.platform.startswith('java'):
10801077
# Jython
10811078
name='Jython'
1082-
match=_sys_version_parser.match(sys_version)
1079+
match=sys_version_parser.match(sys_version)
10831080
ifmatchisNone:
10841081
raiseValueError(
10851082
'failed to parse Jython sys.version: %s'%
@@ -1091,8 +1088,13 @@ def _sys_version(sys_version=None):
10911088

10921089
elif"PyPy"insys_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"
1095-
match=_pypy_sys_version_parser.match(sys_version)
1097+
match=pypy_sys_version_parser.match(sys_version)
10961098
ifmatchisNone:
10971099
raiseValueError("failed to parse PyPy sys.version: %s"%
10981100
repr(sys_version))
@@ -1101,7 +1103,7 @@ def _sys_version(sys_version=None):
11011103

11021104
else:
11031105
# CPython
1104-
match=_sys_version_parser.match(sys_version)
1106+
match=sys_version_parser.match(sys_version)
11051107
ifmatchisNone:
11061108
raiseValueError(
11071109
'failed to parse CPython sys.version: %s'%
@@ -1290,13 +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"\\([\\\$\"\'`])")
13001295
# /etc takes precedence over /usr/lib
13011296
_os_release_candidates= ("/etc/os-release","/usr/lib/os-release")
13021297
_os_release_cache=None
@@ -1311,10 +1306,18 @@ def _parse_os_release(lines):
13111306
"PRETTY_NAME":"Linux",
13121307
}
13131308

1309+
# NAME=value with optional quotes (' or "). The regular expression is less
1310+
# strict than shell lexer, but that's ok.
1311+
os_release_line=re.compile(
1312+
"^(?P<name>[a-zA-Z0-9_]+)=(?P<quote>[\"\']?)(?P<value>.*)(?P=quote)$"
1313+
)
1314+
# unescape five special characters mentioned in the standard
1315+
os_release_unescape=re.compile(r"\\([\\\$\"\'`])")
1316+
13141317
forlineinlines:
1315-
mo=_os_release_line.match(line)
1318+
mo=os_release_line.match(line)
13161319
ifmoisnotNone:
1317-
info[mo.group('name')]=_os_release_unescape.sub(
1320+
info[mo.group('name')]=os_release_unescape.sub(
13181321
r"\1",mo.group('value')
13191322
)
13201323

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve import time of:mod:`platform` module.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp