Python'模块'对象是不可调用的问题,试图以几种不同的方式导入模块

时间:2012-11-19 20:47:57

标签: python import web.py

我最近接手维护一个用Python编写并使用web.py的网站。我创建了一个我想要导入的类,但是我得到了“TypeError:'module'对象不可调用”错误。所有.py模块都存储在目录调用“lib”中。在lib目录中有以下模块 - noun.py,verb.py,context.py,word.py,base.py。在lib目录中是--init--.py文件。我正在尝试将noun.py模块导入上下文模块。下面是context.py模块中用于导入其他模块的代码。

from lib import verb, word, base

这似乎适用于导入动词,单词和基本模块。但是,当我在该语句的末尾添加名词以使其成为...

from lib import, verb, word, base, noun

我得到“TypeError:'module'对象不可调用”错误。我也试过......

import noun #Also produces the same error

所以我尝试了以下......

from noun import *

当我以这种方式导入模块时,错误被消除,但是当我引用名词模块的属性时,我得到错误“AttributeError:名词实例没有属性'get_stem_used'”。以下是名词模块的代码......

from base import base

class noun:
    wordBase = None
    stemBase = None

    def __init__(self, pId):
        b = base()
        wrdBase = b.get_word_base(pId)
        self.wordBase = wrdBase['base']
        stmBase = b.get_stemBase(pId)
        self.stemBase = stmBase['stem']
        #Code to make sure the module is instantiated correctly and the data is validated

    def get_output(self):
        return self.wordBase

    def get_stem_used(self):
        return self.stemBase

verb.py模块与noun.py模块的代码基本相同。在context.py模块中,我有以下代码......

 n = noun(id)
 base = n.get_output()
 #I print out base to make sure everything is good and it is

 v = verb(id)
 verb = v.get_output()

然后将“n”和“v”传递给word.py模块。在word.py模块中有以下代码。

if v.get_stem_used == "Some Value":
    #do whatever
elif n.get_stem_used == "Another value":  #This line produces the "attribute error"
    #do something

当我尝试访问n.get_stem_used时,我得到“AttributeError:名词实例没有属性'get_stem_used'”错误。我做了一些研究,我遇到了这个网址http://effbot.org/zone/import-confusion.htm这让我相信我没有正确导入名词模块,因为我没有使用以下代码导入名词模块...不允许我使用点符号来引用带有名词类的元素。

from lib import, verb, word, noun

我很奇怪,在上面的语句末尾添加“noun”是行不通的,但它似乎正确地导入了所有其他模块。我已经看到混合选项卡和空格可能会导致此错误,但我已经使用我的编辑器检查它是否已正确选项卡。我已经在这方面工作了一段时间,所以任何帮助都非常感谢。感谢。

以下是--init - .py

中的内容
#!/usr/local/bin/python2.5
# -*- coding: utf-8 -*-

1 个答案:

答案 0 :(得分:3)

似乎课程和模块之间存在混淆。你说你正在做from lib import noun,然后是n = noun(id)。这是您的错误的来源:noun这里是指名词模块,而不是该模块中的名词类。 Java不是Python:类是可以从模块中单独导入的名称,它们不必与它们所在的模块具有相同的名称,并且模块中可以有多个类。

所以,你要么做:

from lib import noun
n = noun.noun(id)

from lib.noun import noun
n = noun(id)

(顺便说一句,如果您使用符合PEP8的名称,这很明显:您导入noun但是实例化Noun。)

其他“非Java”要点:不需要get_outputget_stem_used方法,只需直接引用wordBasestemBase。但是,如果你有这些方法,你需要在你的比较中实际调用它们:if n.get_stem_used() == "Another value"等等。 (虽然Java也是如此,当然 - 你可能使用过Ruby或Scala吗?)