【问题标题】:Fake unresolved import error in PyDevPyDev中的假未解决导入错误
【发布时间】:2012-12-25 00:07:29
【问题描述】:

PyDev 正在报告不存在的导入错误。最初的症状是假的“未解决的导入”错误,通过以下组合修复:

  • 清理项目
  • 重新索引项目(删除解释器,重新添加)
  • 重启 Eclipse
  • 烧香给蟒蛇神

现在错误是“来自导入的未验证变量”——它似乎找不到 pymssql.connect。

这不是 PYHTONPATH 问题。我可以很好地访问该模块,文件中存在(据称)错误的代码运行良好——它有单元测试和生产代码调用它。

错误出现在 PyDev 的某个地方:我在我的 PyDev 项目中添加了一个新模块,并且该错误仅出现在新模块中。以上方法我都试过了。


所以,我计划在其他地方发布此代码,以征求一些关于设计的 cmets,并在 cmets 中要求我发布代码。 (灵感来自:Database connection wrapper 和克林特米勒对这个问题的回答:How do I correctly clean up a Python object?)。导入错误发生在第 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()

【问题讨论】:

  • 请提供邮政编码,谢谢。
  • 我很高兴,我只是不知道我会发布什么,除了导入语句 (import pymssql) 和对函数的调用 (pymssql.connect)。我相当肯定这是一个 PyDev 环境问题,因为我可以运行我编写的代码。
  • 我想前几行显示了导入语句,让我们知道您正在导入哪个版本的鸡蛋 + Python 版本 + PyDev 版本 + Eclipse 版本
  • >>> import pymssql >>> pymssql.__version__ '2.0.0'
  • 还有:Python 2.7.3、Eclipse 4.2、PyDev 2.7.1。抱歉---我以为我把这些放在了 OP 中。

标签: python eclipse pydev


【解决方案1】:

在错误所在的行尝试ctrl+1,并添加一条评论,说明您正在等待该导入。这应该可以解决 PyDev 错误,因为它会进行静态代码分析而不是运行时分析。

【讨论】:

  • 所以,我使用的是 Mac。我尝试了 Command-1,它给了我一个选项列表:“创建方法”、“创建类”和“@UndefinedMethod”。单击最后一个选项不会执行任何操作。
  • @BenDundee 你去了问题所在的那一行吗?应该有一个选项可以说明忽略错误或添加评论
  • 这是我看到的(临时链接,30 天后过期):filedropper.com/screenshot2013-01-10at95326am
  • @BenDundee 我会在我的家庭环境下班后检查一下。
  • @BenDundee 哦,我知道你在哪里,转到导入行并给我看截图
【解决方案2】:

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

问题似乎确实消失了。

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

另请注意,当我使用 Python 枚举 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

【讨论】:

    【解决方案3】:

    我在抛出错误的行尾添加了#@UndefinedVariable。

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

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      相关资源
      最近更新 更多