我有一个通常在Windows下运行并使用win32com模块的类。我也有一个此类的模拟版本,可用于测试和演示目的,它是从原始版本导入的,应该可以在任何地方运行。因此,就像这样,在两个文件中:

import win32com.client
class basic():
    def local_instance(self):
        # called once during setup of execution
        res = win32com.client.Dispatch('Foo.Bar')
    def res_attrib(self):
        # called repeatedly by threads; must re-instantiate COM obj
        return win32com.client.Dispatch('Foo.Bar').Attribute
    def otherstuf(self):
        ...

=======================
from basic import basic

class mock(basic):
    def local_instance(self):
        res = mock_foobar()    # mock implementation with .Attribute
    def res_attrib(self):
        return res.Attribute   # mock implementation, this is OK
    # otherwise uses otherstuf() unchanged


问题是当模拟版本在没有win32com的环境中加载时,会抛出import win32com.client语句。

我的问题是,限制该导入应用的正确方法是什么?


将导入嵌入到每个方法中,将在其中重复执行:

def local_instance(self):
    import win32com.client
    res = win32com.client.Dispatch('Foo.Bar')
def res_attrib(self):
    import win32com.client
    return win32com.client.Dispatch('Foo.Bar').Attribute

将导入和def嵌套在try块中,如果用户尝试在Windows环境中运行basic但未碰巧安装了win32com,则将在奇怪的地方失败:

try:
    import win32com.client
    def local_instance(self):
        res = win32com.client.Dispatch('Foo.Bar')
    def res_attrib(self):
        return win32com.client.Dispatch('Foo.Bar').Attribute
except:
    # alternate or no defs

或其他?

最佳答案

将导入和def嵌套在try块中,


这是大多数人使用的标准方法。

在任何类定义之外执行此操作。在您的普通进口产品中达到最高水平。只有一次。

在此模块之后的任何类定义中使用这两个函数。

try:
    import win32com.client
    def local_instance():
        res = win32com.client.Dispatch('Foo.Bar')
    def res_attrib():
        return win32com.client.Dispatch('Foo.Bar').Attribute
except ImportError, why:
    # alternate or no defs



  如果用户尝试在Windows环境中运行基本版本但未恰好安装了win32com,则它将奇怪地失败:


这根本不是真的。

首先,您可以检查why变量。

其次,您可以检查os.nameplatform.uname()以查看是否为Win32,并根据操作系统更改except块。

关于python - 如何限制可能引发的进口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6791920/

10-12 18:42