Skip to main content
 首页 » 编程设计

Python: AttributeError: 'module' 对象没有属性 'append'

2025年05月04日77webabcd

我正在尝试制作一个引擎,该引擎以如下格式获取包含 python 文件和函数的文件的内容:

lib1 func1 func2 func3 
lib2 func4 

等我用两个 python 文件和三个函数设置了一个测试,但是我用来导入库和函数的代码不起作用:

class engine (object): 
    def __init__ (self, sceneFile): 
        # gets contents of sceneFile, then closes 
        scenes         = open (sceneFile, 'r') 
        lines = scenes.readlines () 
        scenes.close () 
        self.libs = [] 
 
        # finds functions and libraries 
        for i in range (len (lines)): 
            lineContents = lines[i].split() 
            self.libs.append (importlib.import_module (lineContents[0]))  # libraries in sceneFile 
            for j in range (len (lineContents) - 1): 
                self.libs[i].append (lineContents[j + 1])          # functions in sceneFile 
 
    def start (self, nextScene): 
        # finds function and library, imports 
        for i in range (len (self.libs)): 
            for j in range (len (self.libs[i])): 
                if self.libs[i][j] == nextScene: 
                    nextScene = getattr (self.libs[i], self.libs[i][j]) 
                    self.start (nextScene) 

当我尝试使用测试程序运行它时,会弹出此错误:

Traceback (most recent call last): 
  File "ugsE.py", line 32, in <module> 
    Engine = engine ("ugsEtest.txt") 
  File "ugsE.py", line 21, in __init__ 
    self.libs[i].append (lineContents[j + 1])          # functions in sceneFile 
AttributeError: 'module' object has no attribute 'append' 

这是什么意思?我感觉这是因为我正在创建一个模块列表,但这不应该起作用吗?

请您参考如下方法:

libs 是一个模块列表,所以 libs[i] 是一个模块。 libs[i].append 失败,因为您无法将某些内容附加到模块。

严格来说,这段代码将实际运行在libs[i] 是一个公开其自己的append 方法(具有兼容的签名),但这肯定不会做你想要的。


您可以通过将 libs 转换为元组列表来实现您想要的效果,其中第一个元素是库,第二个元素是与该库关联的函数列表:

for line in lines: 
    lineContents = line.split() 
    self.libs.append((importlib.import_module(lineContents[0]), lineContents[1:])) 

然后你可以访问库 i 作为 self.libs[i][0] 和函数 j 作为 self.libs [i][1][j].

如果需要,您还可以使用 slices 消除循环并将整个 __init__ 减少到只有三行, list comprehensions , 和一个 with statement :

with open(sceneFile, 'r') as scenes: 
    lines = (l.split() for l in scenes) 
    self.libs = [(importlib.import_module(l[0]), l[1:]) for l in lines]