1

我最近接管了维护一个用 Python 编写并使用 web.py 的网站。我创建了一个我想导入的类,但我收到“TypeError:'module' object is not callable”错误。所有 .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:‘模块’对象不可调用”错误。我也试过...

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

在上述语句的末尾添加“名词”对我来说很奇怪,但它似乎正确导入了所有其他模块。我已经看到混合制表符和空格可能会导致此错误,但我已经使用我的编辑器检查了它是否已正确标记。我已经为此工作了一段时间,因此非常感谢任何帮助。谢谢。

以下是--init--.py 中的内容

#!/usr/local/bin/python2.5
# -*- coding: utf-8 -*-
4

1 回答 1

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_outputandget_stem_used方法,只需引用wordBasestemBase直接。但是,如果您确实有这些方法,则需要在比较中实际调用它们:if n.get_stem_used() == "Another value"等等。(当然,Java 也是如此——你用过 Ruby 还是 Scala,也许吧?)

于 2012-11-19T21:20:48.610 回答