如何在一个以有限的方式使用导入模块的模块中编写导入过程?

2024-06-16 14:32:19 发布

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

我有一个功能众多的模块。其中一些功能依赖于其他模块。该模块将用于某些环境中,而这些环境中不会有其他模块。在这些环境中,我希望不依赖于这些其他不可用模块的模块的功能是可用的。什么是合理的编码方式

我很高兴当一个函数的依赖性模块不满足时会出现异常,但我希望该模块可以用于其他没有依赖性问题的函数

目前,我正在考虑一个模块级函数,如下所示:

tryImport(moduleName = None):
    try:
        module = __import__(moduleName)
        return(module)
    except: 
        raise(Exception("module {moduleName} import error".format(
            moduleName = moduleName)))
        sys.exit()

这将在函数中以如下方式使用:

def function1():
    pyfiglet = tryImport(moduleName = "pyfiglet")

Tags: 模块函数import功能nonereturn环境依赖性
2条回答

请用句号

首先,你描述的问题表明你应该重新设计你的模块。最明显的解决方案是将它分解为一个包中的几个模块。它们中的每一个都包含一组具有公共外部依赖关系的函数。如果只知道目标计算机上可能缺少哪些依赖项,就可以轻松定义需要多少组。然后可以分别导入它们。基本上,在一个给定的环境中,你只导入你需要的东西,问题就不存在了

如果您仍然认为情况并非如此,并坚持将所有功能保留在一个模块中,那么您可以始终执行以下操作:

if env_type == 'env1':
    import pyfiglet
if env_type in ('env1', 'env2'):
    import pynose
    import gzio

如何演绎环境类型取决于你。可能来自某个配置文件或环境变量。
然后你就有了这个模块中的函数。如果没有模块使用者调用函数来使用给定环境中不可用的模块,则不会出现问题。
我认为抛出自定义异常没有任何意义NameError在尝试访问未导入的名称时,仍将抛出异常。顺便说一下,你的sys.exit()无论如何都不会被执行

如果不想定义环境类型,仍然可以使用以下代码实现此目标:

try: import pyfiglet
except ImportError: pass
try: import pynose
except ImportError: pass
try: import gzio
except ImportError: pass

这两个代码段都应该用于模块级,而不是函数内部

TL;博士我只想把这个模块分成几个部分。但是如果你真的要保持它的整体性,只需要使用基本的语言特性,不要通过使用__import__和一个专用函数来过度设计它

对于您的用例,将您需要的导入放在函数中,而不是放在模块的顶部,听起来没有什么错(别担心,重新导入几乎不需要任何成本):

def some_function():
    import foo # Throws if there is no foo
    return foo.bar ()

相关问题 更多 >