Как включить завершение кода для словаря из метода в Python? - PullRequest
0 голосов
/ 13 сентября 2018

Я использую 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 объекте!

1 Ответ

0 голосов
/ 14 сентября 2018

PyCharm не знает, что содержит dict, если вы заполняете его динамически.Таким образом, вы должны заранее сообщить PyCharm о ключах dict. Prodict делает именно это для подсказки 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

Отказ от ответственности : Я являюсьавтор Prodict.

...