[Python-Dev] Imports with underscores

Terry Reedy tjreedy at udel.edu
Mon Jan 9 12:01:04 EST 2017


On 1/9/2017 6:42 AM, Steve Holden wrote:
> One of my developers recently submitted a pull request incuding a number
> of lines like
>
> import os as _os
>
> When I asked him why he suggested a) this would improve encapsulation,
> and b) the practice was supported in the stdlib. Further investigation
> reveals that some modules (e.g. argparse, crypt, difflib, random) do use
> this technique, but it is far from universal.

> So I thought it would be useful to get input from current devs about the
> value of this practice, since to me it seems somewhat anti-pythonic.
> What advantages does it confer?

If the module does not define __all__, it prevents * imports of the 
module from also importing the imported modules.  For instance:

 >>> sys
Traceback (most recent call last):
   File "<pyshell#1>", line 1, in <module>
     sys
NameError: name 'sys' is not defined
 >>> from tkinter import *
 >>> sys
<module 'sys' (built-in)>
 >>> enum
<module 'enum' from 'C:\\Programs\\Python36\\lib\\enum.py'>
 >>> itertools
Traceback (most recent call last):
   File "<pyshell#5>", line 1, in <module>
     itertools
NameError: name 'itertools' is not defined

Use of such undocumented and unintended attributes of a module is fragile.

1.  The imported module could be changed.  Tkinter's 'import enum' in 
only used in "class EventType(str, enum.Enum):".  The import could well 
be changed to 'from enum import Enum' or even better, 'from enum import 
Enum as _Enum' and the one use modified.

2. The importing module could be changed.  'from tkinter import *' might 
be changed to 'from tkinter import tk, ...' or 'import tkinter as tk' or 
even replaced by another module.

-- 
Terry Jan Reedy



More information about the Python-Dev mailing list