PyDev报告了不存在的导入错误。最初的症状是一个虚假的“未解决的导入”错误,该错误由以下组合修复:
现在错误是“导入的未验证变量” - 它似乎无法找到pymssql.connect。
这不是PYHTONPATH问题。我可以正常访问该模块,文件中的代码(涉嫌)错误运行正常 - 它有单元测试和生产代码调用它。
错误出现在PyDev中:我在PyDev项目中添加了一个新模块,错误只发生在新模块中。我已经尝试了以上所有。
所以,我计划在其他地方发布此代码以征求关于设计的一些评论,我在评论中被要求发布代码。 (灵感来自:Database connection wrapper和Clint Miller对这个问题的回答: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()
答案 0 :(得分:1)
在错误行尝试ctrl+1
并添加评论,说明您希望导入。这应该解决PyDev错误,因为它执行静态代码分析而不是运行时分析。
答案 1 :(得分:1)
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
答案 2 :(得分:0)
我将#@UndefinedVariable添加到抛出错误的行的末尾。
这不是一个永久性的修复,但至少它暂时摆脱了我的屏幕上的红色。如果有一个更好的长期解决方案,我会很高兴听到它。