Могу ли я переопределить действия {} скобок в python? - PullRequest
0 голосов
/ 01 ноября 2018

Я создал подкласс dict согласно этому вопросу . То, что я хотел бы сделать, - это создать новый словарь моего подкласса, используя скобочные обозначения. А именно, когда у меня есть {"key": "value"}, я бы хотел, чтобы он вызывал mydict (("key", "value")). Это возможно?

1 Ответ

0 голосов
/ 01 ноября 2018

Нет. И по уважительным причинам: это нарушило бы ожидания людей, читающих код. Это также может привести к поломке любых сторонних библиотек, которые вы импортируете, которые (разумно) ожидают, что dict литералы будут стандартными словарями Python.

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

MyDict.from({
  "key": "value"
})

Где реализация from может выглядеть примерно так:

@classmethod
def from(cls, dictionary):
    new_inst = cls()
    for key, value of dictionary.items():
        new_inst[key] = value

    return newInst

Редактировать на основании комментария:

user2357112 правильно указывает, что вы можете просто использовать конструктор, если подпись конструктора dict совпадает с вашим пользовательским классом:

some_instance = MyDict({"key": "value"})

Если вы все испортили, вам придется пойти по специальному маршруту а-ля from.

...