在Python类中导入模块

时间:2017-05-20 00:51:52

标签: python

我正在尝试在类中导入不同的模块:

class TCON_COMMS(object):
    TCON_COMMS_AARDVARK = 0
    TCON_COMMS_GPU = 1
    TCON_COMMS_SMC_I2C = 2
    def __init__(self, TCON_COMMS_METHOD=0):
        self.TCON_COMMS_METHOD = TCON_COMMS_METHOD
        if self.TCON_COMMS_METHOD == self.TCON_COMMS_AARDVARK:
            print("Using Aardvark for TCON communication.")
            from i2c_helper_aardvark import *
        elif self.TCON_COMMS_METHOD == self.TCON_COMMS_GPU:
            print("Using AUX for TCON communication.")
            from i2c_helper_aux import *
        else:
            print("Using SMC for TCON communication.")
            from i2c_helper_smc import *

当我写这篇文章时,我得到了:

SyntaxWarning: `import *` only allowed at module level.

这是什么意思?

2 个答案:

答案 0 :(得分:2)

在函数内部,局部变量存储在编号的槽中,而不是存储在全局变量中的字典中。这意味着Python编译器在创建函数的代码对象之前需要知道函数局部变量的所有名称,因此它可以将每个局部变量访问转换为适当的字节码以从插槽读取或写入。

执行from some_module import *时,无法提前知道导入的确切名称。最多some_module它定义的名称(或放入__all__,如果有的话)。这意味着编译器无法提前查看名称并将每个名称分配给插槽。在顶层导入时,不知道前面的名称不是问题,因为每个name / object对只会添加到模块的globals字典中。

要使代码正常工作,您需要只导入模块(并将模块的内容作为属性访问),或者您可以显式命名要从中导入的项目。哪个最好取决于您的品味(也许您需要从模块中获得多少个不同的名称)。

我不知道你的i2c_helper_whatever模块到底需要什么,所以我不能给出一个明确列出的名称的例子,但是这里是一个在常规上使用as子句的例子import为所选的任何模块提供相同的名称(在本地命名空间中)(我不知道我选择的名称是否合适,使用您自己的判断):

def __init__(self, TCON_COMMS_METHOD=0):
    self.TCON_COMMS_METHOD = TCON_COMMS_METHOD
    if self.TCON_COMMS_METHOD == self.TCON_COMMS_AARDVARK:
        print("Using Aardvark for TCON communication.")
        import i2c_helper_aardvark as i2c_helper
    elif self.TCON_COMMS_METHOD == self.TCON_COMMS_GPU:
        print("Using AUX for TCON communication.")
        import i2c_helper_aux as i2c_helper
    else:
        print("Using SMC for TCON communication.")
        import i2c_helper_smc as i2c_helper

    i2c_helper.something() # this will call a function from whichever module was imported

答案 1 :(得分:0)

这意味着您无法在类,函数或其他内容中使用from module import *。将它们移动到文件的顶部。