繁体   English   中英

PyDev中假未解决的导入错误

[英]Fake unresolved import error in PyDev

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()

在错误行尝试ctrl+1 ,并添加注释,说明您希望导入。 这应解决PyDev错误,因为它执行静态代码分析而不是运行时分析。

TL; DR版本:读取第五个灰色框。

您和我的问题似乎是由于多个级别的导入应该(但不是)正确处理。 沿线的某处,联系丢失了。

假设您有一个文件

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

问题确实似乎消失了。

顺便说一下,我注意到有时这似乎发生在导入文件中新定义的符号。 此外,该文件中某些符号的早期错误错误将神奇地消失,只剩下新的错误。 这意味着可能存在某种未被清理的状态文件,即使您“构建”等等。

还要注意,当我使用Python enum hack时,这个问题似乎最让我发生...也许这将为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

我将#@ UndefinedVariable添加到抛出错误的行的末尾。

这不是一个永久性的修复,但至少它暂时摆脱了我的屏幕上的红色。 如果有一个更好的长期解决方案,我会很高兴听到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM