New submission from Serhiy Storchaka:

Since argparse becomes more used as standard way of parsing command-line 
arguments, the number of imports involved when import argparse becomes more 
important. Proposed patch reduces that number by 10 modules.

Unpatched:

$ ./python -c 'import sys; s = set(sys.modules); import argparse; print(len(s), 
len(sys.modules), len(set(sys.modules) - s)); print(sorted(set(sys.modules) - 
s))'
35 65 30
['_collections', '_functools', '_heapq', '_locale', '_operator', '_sre', 
'_struct', 'argparse', 'collections', 'collections.abc', 'copy', 'copyreg', 
'enum', 'functools', 'gettext', 'heapq', 'itertools', 'keyword', 'locale', 
'operator', 're', 'reprlib', 'sre_compile', 'sre_constants', 'sre_parse', 
'struct', 'textwrap', 'types', 'warnings', 'weakref']

$ ./python -S -c 'import sys; s = set(sys.modules); import argparse; 
print(len(s), len(sys.modules), len(set(sys.modules) - s)); 
print(sorted(set(sys.modules) - s))'
23 61 38
['_collections', '_collections_abc', '_functools', '_heapq', '_locale', 
'_operator', '_sre', '_stat', '_struct', 'argparse', 'collections', 
'collections.abc', 'copy', 'copyreg', 'enum', 'errno', 'functools', 
'genericpath', 'gettext', 'heapq', 'itertools', 'keyword', 'locale', 
'operator', 'os', 'os.path', 'posixpath', 're', 'reprlib', 'sre_compile', 
'sre_constants', 'sre_parse', 'stat', 'struct', 'textwrap', 'types', 
'warnings', 'weakref']

Patched:

$ ./python -c 'import sys; s = set(sys.modules); import argparse; print(len(s), 
len(sys.modules), len(set(sys.modules) - s)); print(sorted(set(sys.modules) - 
s))'
35 55 20
['_collections', '_functools', '_locale', '_operator', '_sre', 'argparse', 
'collections', 'copyreg', 'enum', 'functools', 'itertools', 'keyword', 
'operator', 're', 'reprlib', 'sre_compile', 'sre_constants', 'sre_parse', 
'types', 'weakref']

$ ./python -S -c 'import sys; s = set(sys.modules); import argparse; 
print(len(s), len(sys.modules), len(set(sys.modules) - s)); 
print(sorted(set(sys.modules) - s))'
23 51 28
['_collections', '_collections_abc', '_functools', '_locale', '_operator', 
'_sre', '_stat', 'argparse', 'collections', 'copyreg', 'enum', 'errno', 
'functools', 'genericpath', 'itertools', 'keyword', 'operator', 'os', 
'os.path', 'posixpath', 're', 'reprlib', 'sre_compile', 'sre_constants', 
'sre_parse', 'stat', 'types', 'weakref']

The patch defers importing rarely used modules. For example textwrap and 
gettext are used only for output a help and error messages.

The patch also makes argparse itself be imported only when the module is used 
as a script, not just imported. The patch also replaces importing 
collections.abc with _collections_abc in some other basic modules (like 
pathlib), this could allow to avoid importing the collections package if it is 
not used.

Unavoided imports:

* functools is used in re for decorating _compile_repl with lru_cache.
* collections is used in functools for making CacheInfo a named tuple.
* enum is used in re for creating RegexFlag.
* types is used in enum for decorating some properties with 
DynamicClassAttribute.

----------
components: Library (Lib)
messages: 292200
nosy: bethard, haypo, rhettinger, serhiy.storchaka
priority: normal
severity: normal
stage: patch review
status: open
title: Reduce the number of imports for argparse
type: enhancement
versions: Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue30152>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to