Что на самом деле означает «неразрешенная ссылка для проверки»?

#python #sqlite #pycharm

#python #sqlite #pycharm

Вопрос:

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, ни в режиме ОЖИДАНИЯ, ни в PyCharm.

У редактора IDE есть проблема только со строковой SQL-версией строки, а не с другой:

введите описание изображения здесь

Если я наведу указатель на коричневые выделения, я получу сообщение об ошибке. Версия «БЛА-БЛА-БЛА» не имеет проблем.

Это говорит мне, что это как-то связано с SQL / SQLite. Верно?

Ответ №1:

Когда вы используете двойные кавычки внутри строки, ограниченной """ , вы напрашиваетесь на неприятности.

Python способен обрабатывать двойные кавычки в подобных ситуациях, но, похоже, вашему редактору это не нравится — скорее всего, ваш редактор использует более простой синтаксический анализатор, чем интерпретатор Python, и блокирует строку в формате """ x"x """ .

«Неразрешенная ссылка» в этом контексте означает, что PyCharm считает, что слово Finish является ссылочной переменной, поскольку оно ошибочно полагает, что двойная кавычка завершает вашу строку. Конечно, у вас нет именованной ссылочной переменной Finish .

Комментарии:

1. Спасибо за ваш ответ. Я протестировал пару вещей, основанных на вашей идее, и обновил вопрос дополнительной документацией. Я был бы признателен за ваши мысли по этому поводу.

2. Хотя этот ответ может быть правильным для всех (что Pycharm путают строки в тройных кавычках), ваш FYI в конце немного вводит в заблуждение. Тип кавычек, которые Python использует в repr строке, не имеет ничего общего с кавычками, которые использовались программистом для записи строкового литерала каким-либо образом. Текущий repr алгоритм таков: «если в строке есть одинарные кавычки и нет двойных кавычек, заключите в двойные кавычки, в противном случае заключите в одинарные кавычки». Я считаю, что это деталь реализации, поэтому вам, вероятно, не следует полагаться на нее.

3. @martin’s: какие бы кавычки ни отображались в Python repr , они не имеют абсолютно никакого отношения к тому, какие кавычки использовались при создании строки. Если вы начинаете строку в тройных кавычках с «»», вам лучше закончить ее на «»».

4. Итак, вы говорите, что в repr тройных кавычках просто происходит изменение состояния, которое возвращается назад, как только анализатор видит другой набор тройных кавычек? ОК. Я понимаю это. Тем не менее, PyCharm не жалуется на точно такую же строковую структуру, если я изменяю токены SQL на «БЛА». Таким образом, на самом деле это не смущает — по крайней мере, не в этом примере — различными комбинациями кавычек — кажется, — но скорее у него есть проблема с комбинацией кавычек при использовании в контексте инструкции SQL. В этом контексте, что именно является неразрешенной ссылкой?

5. Кстати, спасибо за разъяснение. Я довольно новичок в Python, но занимаюсь разработкой программного обеспечения уже более двадцати лет. Всегда здорово узнавать что-то новое.

Ответ №2:

Получил ответ от JetBrains. Это ошибка. Они работают над этим.

Комментарии:

1. номер ошибки было бы полезно поделиться