我试图制作一个引擎,它以下列格式获取包含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'
这是什么意思?我有一种感觉,因为我创建了一个模块列表,但是不应该这样做吗?
答案 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]
。
如果您愿意,还可以使用slices,list comprehensions和with 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)