Автозаполнение для динамически заполненного словаря, содержащего классы? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть графический интерфейс, и через него я загружаю некоторые данные. Когда файл загружен, его имя файла используется в качестве идентификатора, который заполняет графический интерфейс, а также словарь внизу, чтобы отслеживать текущее состояние для каждого файла.

Однако при таком подходе я не могу получить автозаполнение из класса MetaData, например когда я хочу получить доступ к data.container.[GUIcurrentFile].one_of_many_attributes.

Есть ли способ обойти это? Может быть, хранение файлов в памяти совершенно другим способом? Что люди обычно делают в этих сценариях? Я не слишком знаком с разработкой графического интерфейса.

class Data:
    def __init__(self):
        self.container = dict()

    def load(self, name):
        self.container[name] = MetaData()

class MetaData:
    def __init__(self):
        self.one_of_many_attributes = None


# This is instantiated in the main part of the GUI, e.g. self.data = Data()
data = Data()


## Series of events happening through the GUI
# Grab loaded file through a GUI
GUIcurrentFile = "file1"
data.load(GUIcurrentFile)

GUIcurrentFile = "file2"
data.load(GUIcurrentFile)

# Each file has separate attributes
data.container[GUIcurrentFile].one_of_many_attributes = "foo"

# File is removed from GUI, and can easily be removed from dictionary internally
data.container.pop(GUIcurrentFile)

1 Ответ

0 голосов
/ 09 мая 2018

Хорошо, вот подсказка типа наконец-то щелкнула для меня. Я надеюсь, что оригинальное название имеет смысл в отношении этого ответа. Иначе, не стесняйтесь редактировать это.

Сначала определив метаданные, очень просто добавить подсказку типа для PyCharm, если реализован метод для возврата объекта типа "MetaData".

class MetaData:
    def __init__(self):
        self.foo = None
        self.really_long_name = None

class Data:
    def __init__(self):
        self.container = dict()

    def load(self, name):
        self.container[name] = MetaData()

    def get(self, name) -> MetaData: # specify what dict lookup returns
        return self.container[name]

data = Data()
data.load("file1")
data.get("file1").foo

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...