【问题标题】:What does "Inspection 'Unresolved reference' actually mean?“检查'未解决的参考'实际上是什么意思?
【发布时间】:2014-08-13 00:48:21
【问题描述】:

PyCharm。代码如下:

# db_create.py
#
# Create the database and tables
#

import sqlite3
from config import DATABASE_PATH

with sqlite3.connect(DATABASE_PATH) as connection:
    cursor = connection.cursor()

    # Create table
    cursor.execute("""
                    CREATE TABLE ftasks(
                    task_id INTEGER PRIMARY KEY AUTOINCREMENT,
                    name TEXT NOT NULL,
                    due_date TEXT NOT NULL,
                    priority INTEGER NOT NULL,
                    status INTEGER NOT NULL)
                    """)

    # Insert dummy data into the table
    cursor.execute("""
                    INSERT INTO ftasks (name, due_date, priority, status)
                    VALUES("Finish this tutorial", "02/03/2014", 10, 1)
                    """)

    cursor.execute("""
                    INSERT INTO ftasks (name, due_date, priority, status)
                    VALUES("Finish Real Python Course 2", "02/03/2014", 10, 1)
                    """)

代码运行良好。数据库已创建,一切正常。但是,我在 IDE 上收到此消息。不知道它指的是什么:

我通过简单地更改上面显示的代码来消除错误消息:

# Insert dummy data into the table
cursor.execute("""
                INSERT INTO ftasks (name, due_date, priority, status)
                VALUES('Finish this tutorial', '02/03/2014', 10, 1)
                """)

cursor.execute("""
                INSERT INTO ftasks (name, due_date, priority, status)
                VALUES('Finish Real Python Course 2', '02/03/2014', 10, 1)
                """)

唯一的变化是在 SQL 语句中使用单引号。

为什么双引号版本是未解析的引用?

我应该注意到,这两个版本的代码完全相同产生相同的数据库文件和内容。

基于三引号内的双引号会导致 PyCharm 的编辑器/解析器出现问题的建议进一步研究。

我在编辑器上试过这段代码:

a = """
INSERT INTO atable (column1, column2)
VALUES ("test",'test')
"""

b = """
BLAH BLAH atable (column1, column2)
BLAH ("test",'test')
"""

并且还在 Python 命令行上运行它:

>>> a = """
INSERT INTO atable (column1, column2)
VALUES ("test",'test')
"""
>>> b = """
BLAH BLAH atable (column1, column2)
BLAH ("test",'test')
"""
>>> a
'\nINSERT INTO atable (column1, column2)\nVALUES ("test",\'test\')\n'

>>> b
'\nBLAH BLAH atable (column1, column2)\nBLAH ("test",\'test\')\n'

以上两个定义都产生了具有完全相同结构的字符串。在 Python 命令行、IDLE 或 PyCharm 中,我没有看到关于在三引号字符串中使用这两种引号的任何问题。

IDE 编辑器只有字符串的 SQL 版本有问题,其他没有:

如果我将指针悬停在棕色突出显示上,我会收到错误消息。 “BLAH BLAH”版本没有问题。

这告诉我它与 SQL/SQLite 有关。对吧?

【问题讨论】:

    标签: python sqlite pycharm


    【解决方案1】:

    当您在以""" 为界的字符串内使用双引号时,您是在自找麻烦。

    Python 能够在这些类型的情况下处理双引号,但您的编辑器似乎不喜欢它 - 很可能您的编辑器使用比 Python 解释器更简单的解析器,并且以 @ 格式阻塞 String 987654322@.

    "Unresolved Reference" 在这种情况下意味着 PyCharm 认为单词 Finish 是一个引用变量,因为它错误地认为双引号结束了你的字符串。当然,您没有名为 Finish 的引用变量。

    【讨论】:

    • 感谢您的回答。我根据您的想法测试了几件事,并使用更多文档更新了问题。感谢您对此的看法。
    • 虽然这个答案可能是正确的(Pycharm 被三重引号字符串混淆了),但你最后的 FYI 有点误导。 Python 在字符串的repr 中使用的引号与程序员用来以任何方式编写字符串文字的引号没有任何关系。当前的repr算法是:“如果字符串中有单引号且没有双引号,则用双引号引起来,否则用单引号引起来。”我相信这是一个实现细节,所以你可能不应该依赖它。
    • @martin's:Python 用repr 显示的引号与创建字符串时使用的引号完全没有关系。如果你用 """ 开始一个三引号字符串,你最好用 """ 结束它。
    • 所以你是说在repr 中,三引号只会产生状态变化,一旦解析器看到另一组三引号就会恢复?好的。我明白了。尽管如此,如果我用“BLAH”更改 SQL 标记,PyCharm 并没有抱怨完全相同的字符串结构。因此,它并没有真正混淆——至少在这个例子中没有——被各种引号组合——看起来——而是在 SQL 语句的上下文中使用时,引号组合存在问题。在这种情况下,究竟什么是未解析的引用?
    • 顺便说一句,感谢您的澄清。我对 Python 还很陌生,但从事软件开发已有 20 多年了。学习新东西总是很酷。
    【解决方案2】:

    从 JetBrains 得到消息。这是一个错误。他们正在努力。

    【讨论】:

    • bug 编号将有助于分享
    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    相关资源
    最近更新 更多