Python-在i中导入

2024-06-07 06:40:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我为urllib(python3)编写了一个小包装。在if中导入模块是否正确和安全?

if self.response_encoding == 'gzip':
    import gzip

我没有发现任何关于这个密码的鼓动。不过,这让我很困扰。


Tags: 模块importself密码ifresponseurllibpython3
3条回答

当然,没关系。如果模块中有您并不总是希望运行的初始化代码,那么它甚至是必要的。

Python标准库使用它,因此它绝对是正确和安全的。请参阅^{} module source以获得一个极好的示例:

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

这里,我们基本上使用了if测试的道德等价物:如果您可以导入check_output,那么就这样做,否则在这里定义完整的函数。

import语句只是将外部代码重新绑定到本地名称。在这方面,使用if控制流控制导入与在if语句中分配变量没有区别。你需要确保你最终不会在没有定义名称的情况下使用它。

实际上,这是一个相当常见的成语。有时您会看到它在不同的模块之间进行选择:

if system == 'linux':
   import linuxdeps as deps
elif system == 'win32':
   import win32deps as deps

然后,假设linuxdepswin32deps都有相同的函数,您就可以使用它:

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

相关问题 更多 >