1

私は最近、Pythonで記述され、web.pyを使用するWebサイトの保守を引き継ぎました。インポートしたいクラスを作成しましたが、「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'がありません」というエラーが発生します。私はいくつかの調査を行い、このURL 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。)

get_outputその他の「Javaではない」ポイント:メソッドとメソッドは必要ありません。get_stem_used参照するだけwordBasestemBase直接実行できます。ただし、これらのメソッドがある場合、比較で実際に呼び出す必要がありますif n.get_stem_used() == "Another value"。(もちろん、これはJavaにも当てはまりますが、RubyまたはScalaを使用したことがありますか?)

于 2012-11-19T21:20:48.610 に答える