Как включить автозавершение кода для словаря из метода в Python?

Я использую Python 3.6 с PyCharm, и меня немного расстраивает, что нет поддержки автозавершения кода для особых случаев словарных объектов (с фиксированной ключевой схемой).

Скажем, например, я создаю и пытаюсь получить доступ к простому объекту словаря, подобному этому:

inventory = {'name': 'hammer', 'price': 2.3}
inventory['']

Когда я помещаю курсор в кавычки '' и нажимаю Ctrl + Space, я получаю завершение кода, и IDE правильно предлагает все возможные ключи в объекте словаря. Это большой!

Но если я попытаюсь создать его как служебную функцию, которая возвращает тот же объект dict, скажем, со значениями, которые предоставляет пользователь, но с теми же ключами dict, - тогда я больше не получу завершения кода!

def get_inventory(name: str, price: float):
    return {'name': name, 'price': price}

inventory = get_inventory('hammer', 2.3)
inventory['']    # <- Pycharm can't offer any suggestions! 

Любой обходной путь или решение для этого? Я уже искал похожие решения, но не нашел ничего, что работает. Я знаю, что могу просто преобразовать его в класс Inventory и таким образом получить доступ к свойствам, но я не хочу этого делать по нескольким причинам:

  • Мне нужно, чтобы объект легко конвертировался в JSON, так как я могу часто передавать его из / в JSON, а объекты dict являются самыми простыми для этой цели.
  • хранить его как класс не имеет большого смысла, так как он мне все равно нужен как контейнер данных, с минимальными свойствами, хранящимися в нем

Любая помощь или решение о том, как я могу заставить свою IDE помогать в завершении кода, распознавая возможные ключи в таком объекте dict, были бы очень признательны!

stackoverflow.com/a/15022934/8150371
Stack 13.09.2018 19:51

это предлагаемое решение ничего не делает для меня ... даже если этот параметр отмечен, когда я создаю код и пытаюсь получить доступ из объекта dict по ключу, я все равно получаю вывод `` Нет предложений '', и мне все равно придется вручную войдите в него.

rv.kvetch 13.09.2018 19:56

вы всегда можете попробовать другие IDE, такие как Visual Studio

Rinogg 13.09.2018 21:35

Вы можете использовать JSON с большинством объектов (определяемого пользователем типа) так же легко, как и с dict - просто вызовите vars, чтобы получить dict, возможно, в сочетании с dict.update.

Davis Herring 14.09.2018 03:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
4
3 830
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

PyCharm не знает, что содержит dict, потому что его ключи и значения обозначаются во время выполнения. Поэтому вам нужно как-то заранее намекнуть PyCharm о ключах dict. Продикт делает именно это, чтобы намекнуть PyCharm, чтобы вы получили завершение кода.

class Inventory(Prodict):
    name: str
    price: float


def get_inventory(name: str, price: float):
    return Inventory(name=name, price=price)


inventory = get_inventory('hammer', 2.3)
print(inventory.name)
print(inventory.price)

В приведенном выше коде атрибуты name и price заполняются автоматически.

Поскольку Prodict происходит непосредственно от dict, вы можете использовать его как обычный dict.

Это снимок экрана из репозитория Prodict, который иллюстрирует завершение кода:

Prodict code completion

PS: Я автор Продикта.

Отличный инструмент. Я думаю, было бы полезно заранее сообщить другим, что именно заставляет IDE знать о dict. Это переопределенный метод __dir__ или что-то в этом роде и где он находится в вашем коде?

Phani Rithvij 28.03.2021 10:26

@PhaniRithvij потребуется слишком много места, чтобы объяснить, как это работает. Код находится в ссылке github за именем пакета Prodict (github.com/ramazanpolat/prodict)

Ramazan Polat 29.03.2021 08:50

Другие вопросы по теме