if 'posix' in _names:
name = 'posix'
linesep = '\n'
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
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
if system == 'linux':
import linuxdeps as deps
elif system == 'win32':
import win32deps as deps
然后,假设linuxdeps和win32deps都有相同的函数,您就可以使用它:
deps.func()
这甚至用于在标准库中获取os.path(以下是os的一些源代码):
if 'posix' in _names:
name = 'posix'
linesep = '\n'
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
elif 'nt' in _names:
name = 'nt'
linesep = '\r\n'
from nt import *
try:
from nt import _exit
except ImportError:
pass
import ntpath as path
import nt
__all__.extend(_get_exports_list(nt))
del nt
当然,没关系。如果模块中有您并不总是希望运行的初始化代码,那么它甚至是必要的。
Python标准库使用它,因此它绝对是正确和安全的。请参阅^{} module source 以获得一个极好的示例:
在python中有条件地导入模块是很常见的。而不是
if
,你经常会看到try:
/except ImportError:
组合:这里,我们基本上使用了
if
测试的道德等价物:如果您可以导入check_output
,那么就这样做,否则在这里定义完整的函数。import语句只是将外部代码重新绑定到本地名称。在这方面,使用
if
控制流控制导入与在if
语句中分配变量没有区别。你需要确保你最终不会在没有定义名称的情况下使用它。实际上,这是一个相当常见的成语。有时您会看到它在不同的模块之间进行选择:
然后,假设
linuxdeps
和win32deps
都有相同的函数,您就可以使用它:这甚至用于在标准库中获取
os.path
(以下是os
的一些源代码):相关问题 更多 >
编程相关推荐