繁体   English   中英

在Python类中导入模块

[英]Import module inside Python class

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

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.

这是什么意思?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM