5

PyDev は、存在しないインポート エラーを報告しています。最初の症状は偽の「未解決のインポート」エラーでしたが、次のいくつかの組み合わせで修正されました。

  • プロジェクトのクリーニング
  • プロジェクトの再インデックス (インタープリターを削除し、再度追加)
  • Eclipse の再起動
  • ニシキヘビの神々にお香を焚く

現在、エラーは「インポートからの未確認の変数」です-pymssql.connectが見つからないようです。

これは PYHTONPATH の問題ではありません。モジュールに問題なくアクセスできます。(疑わしい) エラーのあるファイル内のコードは正常に実行されます。単体テストとそれを呼び出す実稼働コードがあります。

エラーは PyDev のどこかにあります: PyDev プロジェクトに新しいモジュールを追加しましたが、エラーは新しいモジュールでのみ発生します。上記のすべてを試しました。


そのため、このコードを別の場所に投稿して、デザインに関するコメントを求めることを計画していたところ、コメントでコードを投稿するように求められました。(触発:データベース接続ラッパーとこの質問に対する Clint Miller の回答: Python オブジェクトを正しくクリーンアップするにはどうすればよいですか? )。インポート エラーは 69 行目 (self.connection = pymssql.connect...) で発生します。これが質問に答える上で何をするのかはわかりませんが...

import pymssql
from util.require_type import require_type

class Connections(object):
    @require_type('host', str)
    @require_type('user', str)
    @require_type('password', str)
    @require_type('database', str)
    @require_type('as_dict', bool)
    def __init__(self, host, user, password, database, as_dict=True):
        self.host = host
        self.user = user
        self.password = password
        self.db = database
        self.as_dict = as_dict

    @staticmethod
    def server1(db):
        return Connections('','','','')

    @staticmethod
    def server2(db):
        pass

    @staticmethod
    def server3(db):
        pass


class DBConnectionSource(object):
    # Usage:
    #        with DBConnectionSource(ConnectionParameters.server1(db = 'MyDB)) as dbConn:
    #            results = dbConn.execute(sqlStatement)

    @require_type('connection_parameters', Connections)
    def __init__(self, connection_parameters=Connections.server1('MyDB')):
        self.host = connection_parameters.host
        self.user = connection_parameters.user
        self.password = connection_parameters.password
        self.db = connection_parameters.db
        self.as_dict = connection_parameters.as_dict
        self.connection = None

    def __enter__(self):

        parent = self

        class DBConnection(object):
            def connect(self):
                self.connection = pymssql.connect(host=parent.host,
                                                  user=parent.user,
                                                  password=parent.password,
                                                  database=parent.db,
                                                  as_dict=parent.as_dict)

            def execute(self, sqlString, arguments={}):
                if self.connection is None:
                    raise Exception('DB Connection not defined')
                crsr = self.connection.cursor()
                crsr.execute(sqlString, arguments)
                return list(crsr)

            def cleanup(self):
                if self.connection:
                    self.connection.close()

        self.connection = DBConnection()
        self.connection.connect()
        return self.connection

    def __exit__(self, typ, value, traceback):
        self.connection.cleanup()
4

3 に答える 3

1

TL;DR バージョン: 5 番目の灰色のボックスを読んでください。

あなたの問題(および私のもの)は、正しく処理されるべきであるが正しく処理されていない複数レベルのインポートが原因であるようです。線に沿ったどこかで、リンケージが失われます。

ファイルがあると仮定します。

foo/bar.py

そのファイル内に、という名前のシンボルがあること

wazoo=15

次に試してみると:

from foo import bar
from bar import wazoo <-- false error here

または、使用しようとすると:

from foo import bar
...
i = bar.wazoo <-- false error here

wazooで偽の未解決エラーが発生する場合があります。バグであるため、これは明らかに一貫性がありません。

ただし、次のようにします。

from foo.bar import wazoo

問題は解決しているようです。

余談ですが、これは、インポートされたファイル内の新しく定義されたシンボルに対して時々発生するように見えることに注意しました。さらに、そのファイル内の一部のシンボルに対する以前の誤ったエラーは魔法のように消え、新しいエラーだけが残ります。これは、「buildall」を実行しても、クリーニングされていない状態ファイルが存在する可能性があることを意味します。

また、この問題は、私が Python enum ハックを使用するときに最も発生するように思われることにも注意してください...おそらく、これは PyDev-elopers への手がかりを提供します (PyDev はもう維持されていますか?):

bar.py:

def enum(**enums):
  return type('Enum', (), enums)

SOMETHING = enum(A=1, B=2)

someotherfile.py:

from foo import bar
from bar import SOMETHING
...
x = SOMETHING.A
于 2015-08-11T18:31:12.550 に答える
1

エラーが発生した行を試しctrl+1て、そのインポートを予期していることを示すコメントを追加してください。これにより、ランタイム分析ではなく静的コード分析が行われるため、PyDev エラーが解決されるはずです。

于 2013-01-10T15:34:17.507 に答える
0

エラーをスローする行の最後に # @UndefinedVariable を追加しました。

これは恒久的な修正ではありませんが、少なくとも当分の間、画面から赤みを取り除きました. より良い長期的な修正があれば、それを聞いてうれしいです.

于 2014-02-18T17:12:41.513 に答える