Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
81108375
Commit
81108375
authored
Sep 26, 2017
by
Serhiy Storchaka
Committed by
GitHub
Sep 26, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bpo-30152: Reduce the number of imports for argparse. (#1269)
parent
f1502d09
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
59 additions
and
49 deletions
+59
-49
Lib/argparse.py
Lib/argparse.py
+26
-14
Lib/enum.py
Lib/enum.py
+4
-7
Lib/gettext.py
Lib/gettext.py
+9
-5
Lib/locale.py
Lib/locale.py
+3
-3
Lib/os.py
Lib/os.py
+9
-12
Lib/pathlib.py
Lib/pathlib.py
+1
-1
Lib/types.py
Lib/types.py
+4
-4
Lib/weakref.py
Lib/weakref.py
+3
-3
No files found.
Lib/argparse.py
View file @
81108375
...
...
@@ -84,15 +84,12 @@ __all__ = [
import
collections
as
_collections
import
copy
as
_copy
import
os
as
_os
import
re
as
_re
import
sys
as
_sys
import
textwrap
as
_textwrap
from
gettext
import
gettext
as
_
,
ngettext
SUPPRESS
=
'==SUPPRESS=='
OPTIONAL
=
'?'
...
...
@@ -137,10 +134,16 @@ class _AttributeHolder(object):
return
[]
def
_ensure_value
(
namespace
,
name
,
value
):
if
getattr
(
namespace
,
name
,
None
)
is
None
:
setattr
(
namespace
,
name
,
value
)
return
getattr
(
namespace
,
name
)
def
_copy_items
(
items
):
if
items
is
None
:
return
[]
# The copy module is used only in the 'append' and 'append_const'
# actions, and it is needed only when the default value isn't a list.
# Delay its import for speeding up the common case.
if
type
(
items
)
is
list
:
return
items
[:]
import
copy
return
copy
.
copy
(
items
)
# ===============
...
...
@@ -619,12 +622,17 @@ class HelpFormatter(object):
def
_split_lines
(
self
,
text
,
width
):
text
=
self
.
_whitespace_matcher
.
sub
(
' '
,
text
).
strip
()
return
_textwrap
.
wrap
(
text
,
width
)
# The textwrap module is used only for formatting help.
# Delay its import for speeding up the common usage of argparse.
import
textwrap
return
textwrap
.
wrap
(
text
,
width
)
def
_fill_text
(
self
,
text
,
width
,
indent
):
text
=
self
.
_whitespace_matcher
.
sub
(
' '
,
text
).
strip
()
return
_textwrap
.
fill
(
text
,
width
,
initial_indent
=
indent
,
subsequent_indent
=
indent
)
import
textwrap
return
textwrap
.
fill
(
text
,
width
,
initial_indent
=
indent
,
subsequent_indent
=
indent
)
def
_get_help_string
(
self
,
action
):
return
action
.
help
...
...
@@ -952,7 +960,8 @@ class _AppendAction(Action):
metavar
=
metavar
)
def
__call__
(
self
,
parser
,
namespace
,
values
,
option_string
=
None
):
items
=
_copy
.
copy
(
_ensure_value
(
namespace
,
self
.
dest
,
[]))
items
=
getattr
(
namespace
,
self
.
dest
,
None
)
items
=
_copy_items
(
items
)
items
.
append
(
values
)
setattr
(
namespace
,
self
.
dest
,
items
)
...
...
@@ -978,7 +987,8 @@ class _AppendConstAction(Action):
metavar
=
metavar
)
def
__call__
(
self
,
parser
,
namespace
,
values
,
option_string
=
None
):
items
=
_copy
.
copy
(
_ensure_value
(
namespace
,
self
.
dest
,
[]))
items
=
getattr
(
namespace
,
self
.
dest
,
None
)
items
=
_copy_items
(
items
)
items
.
append
(
self
.
const
)
setattr
(
namespace
,
self
.
dest
,
items
)
...
...
@@ -1000,8 +1010,10 @@ class _CountAction(Action):
help
=
help
)
def
__call__
(
self
,
parser
,
namespace
,
values
,
option_string
=
None
):
new_count
=
_ensure_value
(
namespace
,
self
.
dest
,
0
)
+
1
setattr
(
namespace
,
self
.
dest
,
new_count
)
count
=
getattr
(
namespace
,
self
.
dest
,
None
)
if
count
is
None
:
count
=
0
setattr
(
namespace
,
self
.
dest
,
count
+
1
)
class
_HelpAction
(
Action
):
...
...
Lib/enum.py
View file @
81108375
import
sys
from
types
import
MappingProxyType
,
DynamicClassAttribute
from
functools
import
reduce
from
operator
import
or_
as
_or_
# try _collections first to reduce startup cost
try
:
...
...
@@ -744,11 +742,10 @@ class Flag(Enum):
def
__invert__
(
self
):
members
,
uncovered
=
_decompose
(
self
.
__class__
,
self
.
_value_
)
inverted_members
=
[
m
for
m
in
self
.
__class__
if
m
not
in
members
and
not
m
.
_value_
&
self
.
_value_
]
inverted
=
reduce
(
_or_
,
inverted_members
,
self
.
__class__
(
0
))
inverted
=
self
.
__class__
(
0
)
for
m
in
self
.
__class__
:
if
m
not
in
members
and
not
(
m
.
_value_
&
self
.
_value_
):
inverted
=
inverted
|
m
return
self
.
__class__
(
inverted
)
...
...
Lib/gettext.py
View file @
81108375
...
...
@@ -46,13 +46,10 @@ internationalized, to the local language and cultural habits.
# find this format documented anywhere.
import
copy
import
locale
import
os
import
re
import
struct
import
sys
from
errno
import
ENOENT
__all__
=
[
'NullTranslations'
,
'GNUTranslations'
,
'Catalog'
,
...
...
@@ -342,7 +339,9 @@ class GNUTranslations(NullTranslations):
def
_parse
(
self
,
fp
):
"""Override this method to support alternative .mo formats."""
unpack
=
struct
.
unpack
# Delay struct import for speeding up gettext import when .mo files
# are not used.
from
struct
import
unpack
filename
=
getattr
(
fp
,
'name'
,
''
)
# Parse the .mo file header, which consists of 5 little endian 32
# bit words.
...
...
@@ -520,7 +519,9 @@ def translation(domain, localedir=None, languages=None,
if
not
mofiles
:
if
fallback
:
return
NullTranslations
()
raise
OSError
(
ENOENT
,
'No translation file found for domain'
,
domain
)
from
errno
import
ENOENT
raise
FileNotFoundError
(
ENOENT
,
'No translation file found for domain'
,
domain
)
# Avoid opening, reading, and parsing the .mo file after it's been done
# once.
result
=
None
...
...
@@ -533,6 +534,9 @@ def translation(domain, localedir=None, languages=None,
# Copy the translation object to allow setting fallbacks and
# output charset. All other instance data is shared with the
# cached object.
# Delay copy import for speeding up gettext import when .mo files
# are not used.
import
copy
t
=
copy
.
copy
(
t
)
if
codeset
:
t
.
set_output_charset
(
codeset
)
...
...
Lib/locale.py
View file @
81108375
...
...
@@ -14,10 +14,9 @@ import sys
import
encodings
import
encodings.aliases
import
re
import
collections.
abc
import
_collections_
abc
from
builtins
import
str
as
_builtin_str
import
functools
import
warnings
# Try importing the _locale module.
#
...
...
@@ -215,7 +214,7 @@ def format_string(f, val, grouping=False, monetary=False):
percents
=
list
(
_percent_re
.
finditer
(
f
))
new_f
=
_percent_re
.
sub
(
'%s'
,
f
)
if
isinstance
(
val
,
collections
.
abc
.
Mapping
):
if
isinstance
(
val
,
_collections_
abc
.
Mapping
):
new_val
=
[]
for
perc
in
percents
:
if
perc
.
group
()[
-
1
]
==
'%'
:
...
...
@@ -244,6 +243,7 @@ def format_string(f, val, grouping=False, monetary=False):
def
format
(
percent
,
value
,
grouping
=
False
,
monetary
=
False
,
*
additional
):
"""Deprecated, use format_string instead."""
import
warnings
warnings
.
warn
(
"This method will be removed in a future version of Python. "
"Use 'locale.format_string()' instead."
,
...
...
Lib/os.py
View file @
81108375
...
...
@@ -23,7 +23,7 @@ and opendir), and leave all pathname manipulation to os.path
#'
import
abc
import
sys
,
errno
import
sys
import
stat
as
st
_names
=
sys
.
builtin_module_names
...
...
@@ -590,12 +590,10 @@ def _execvpe(file, args, env=None):
argrest
=
(
args
,)
env
=
environ
head
,
tail
=
path
.
split
(
file
)
if
head
:
if
path
.
dirname
(
file
):
exec_func
(
file
,
*
argrest
)
return
last_exc
=
saved_exc
=
None
saved_tb
=
None
saved_exc
=
None
path_list
=
get_exec_path
(
env
)
if
name
!=
'nt'
:
file
=
fsencode
(
file
)
...
...
@@ -604,16 +602,15 @@ def _execvpe(file, args, env=None):
fullname
=
path
.
join
(
dir
,
file
)
try
:
exec_func
(
fullname
,
*
argrest
)
except
(
FileNotFoundError
,
NotADirectoryError
)
as
e
:
last_exc
=
e
except
OSError
as
e
:
last_exc
=
e
tb
=
sys
.
exc_info
()[
2
]
if
(
e
.
errno
!=
errno
.
ENOENT
and
e
.
errno
!=
errno
.
ENOTDIR
and
saved_exc
is
None
):
if
saved_exc
is
None
:
saved_exc
=
e
saved_tb
=
tb
if
saved_exc
:
raise
saved_exc
.
with_traceback
(
saved_tb
)
raise
last_exc
.
with_traceback
(
tb
)
if
saved_exc
is
not
None
:
raise
saved_exc
raise
last_exc
def
get_exec_path
(
env
=
None
):
...
...
Lib/pathlib.py
View file @
81108375
...
...
@@ -6,7 +6,7 @@ import os
import
posixpath
import
re
import
sys
from
collections.
abc
import
Sequence
from
_collections_
abc
import
Sequence
from
errno
import
EINVAL
,
ENOENT
,
ENOTDIR
from
operator
import
attrgetter
from
stat
import
S_ISDIR
,
S_ISLNK
,
S_ISREG
,
S_ISSOCK
,
S_ISBLK
,
S_ISCHR
,
S_ISFIFO
...
...
Lib/types.py
View file @
81108375
...
...
@@ -172,9 +172,6 @@ class DynamicClassAttribute:
return
result
import
functools
as
_functools
import
collections.abc
as
_collections_abc
class
_GeneratorWrapper
:
# TODO: Implement this in C.
def
__init__
(
self
,
gen
):
...
...
@@ -247,7 +244,10 @@ def coroutine(func):
# return generator-like objects (for instance generators
# compiled with Cython).
@
_functools
.
wraps
(
func
)
# Delay functools and _collections_abc import for speeding up types import.
import
functools
import
_collections_abc
@
functools
.
wraps
(
func
)
def
wrapped
(
*
args
,
**
kwargs
):
coro
=
func
(
*
args
,
**
kwargs
)
if
(
coro
.
__class__
is
CoroutineType
or
...
...
Lib/weakref.py
View file @
81108375
...
...
@@ -21,7 +21,7 @@ from _weakref import (
from
_weakrefset
import
WeakSet
,
_IterationGuard
import
collections.
abc
# Import after _weakref to avoid circular import.
import
_collections_
abc
# Import after _weakref to avoid circular import.
import
sys
import
itertools
...
...
@@ -87,7 +87,7 @@ class WeakMethod(ref):
__hash__
=
ref
.
__hash__
class
WeakValueDictionary
(
collections
.
abc
.
MutableMapping
):
class
WeakValueDictionary
(
_collections_
abc
.
MutableMapping
):
"""Mapping class that references values weakly.
Entries in the dictionary will be discarded when no strong
...
...
@@ -340,7 +340,7 @@ class KeyedRef(ref):
super
().
__init__
(
ob
,
callback
)
class
WeakKeyDictionary
(
collections
.
abc
.
MutableMapping
):
class
WeakKeyDictionary
(
_collections_
abc
.
MutableMapping
):
""" Mapping class that references keys weakly.
Entries in the dictionary will be discarded when there is no
...
...
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