Mat*_*łło 22 python if-statement python-import
我为urllib(python3)写了一个小包装器.如果导入模块是否合适且安全?
if self.response_encoding == 'gzip':
import gzip
Run Code Online (Sandbox Code Playgroud)
我没有找到关于此代码的任何PEP.然而,它困扰我.
Mar*_*ers 30
Python标准库使用它,因此它绝对是正确和安全的.请参阅os模块源以获得一个很好的示例:
Run Code Online (Sandbox Code Playgroud)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
在python中有条件地导入模块是很常见的.而不是if,你经常会看到try:/ except ImportError:组合:
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
Run Code Online (Sandbox Code Playgroud)
在这里,我们基本上使用if测试的道德等价物:如果你可以导入check_output,那么,否则在这里定义完整的功能.
import语句只是将外部代码重新绑定到本地名称.使用if控制流来控制导入与if在这方面在语句中分配变量没有什么不同.您需要确保在没有以任何方式定义的情况下最终不使用该名称.
mgi*_*son 11
这实际上是一个相当普遍的习语.您有时会看到它在不同模块之间进行选择:
if system == 'linux':
import linuxdeps as deps
elif system == 'win32':
import win32deps as deps
Run Code Online (Sandbox Code Playgroud)
然后,假设两个linuxdeps与win32deps具有相同的功能,你可以使用它:
deps.func()
Run Code Online (Sandbox Code Playgroud)
这甚至用于进入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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15198 次 |
| 最近记录: |