Python:AttributeError:' module'对象没有属性'追加'

时间:2015-06-12 13:53:50

标签: python

我试图制作一个引擎,它以下列格式获取包含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'

这是什么意思?我有一种感觉,因为我创建了一个模块列表,但是不应该这样做吗?

2 个答案:

答案 0 :(得分:5)

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]

如果您愿意,还可以使用sliceslist comprehensionswith statement消除循环并将整个__init__缩减为三行:

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]

答案 1 :(得分:0)

libs看起来像是数组的元素。除非你能保证self.libs[i]本身就是一个附庸,否则就不会有append方法。

如果您想在索引处“追加”,请使用insert(i, x)