The Python standard library uses it, so it is most definitely proper and safe. See the os
module source for an excellent example:
if 'posix' in _names:
name = 'posix'
linesep = '
'
from posix import *
try:
from posix import _exit
except ImportError:
pass
import posixpath as path
import posix
__all__.extend(_get_exports_list(posix))
del posix
It's quite common to conditionally import modules in python. Instead of if
, you'll often see a try:
/except ImportError:
combination too:
try:
from subprocess import check_output
except ImportError:
# Python 2.6 and before
def check_output(*popenargs, **kwargs):
from subprocess import Popen
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be '
'overridden.')
process = Popen(stdout=PIPE, *popenargs, **kwargs)
output, unused_err = process.communicate()
retcode = process.poll()
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise CalledProcessError(retcode, cmd)
return output
Here, we basically use the moral equivalent of an if
test: If you can import check_output
, do so, otherwise define the full function here.
An import statement is just a re-binding of an external piece of code to a local name. Using an if
control flow to control the import is no different from assigning a variable in an if
statement in that regard. You need to make sure you don't end up using the name without it being defined either way.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…