При объявлении словаря как литерала, есть ли способ указать подсказке, какое значение я ожидаю для определенного ключа?
И затем, для обсуждения: существуют ли руководящие принципы по типизации словаря в python?Мне интересно, считается ли это плохой практикой смешивать типы в словарях.
Вот пример:
Рассмотрим объявление словаря в классе __init__
:
(отказ от ответственности: я понимаю, что в этом примере некоторые из .elements
записей, вероятно, будут более подходящими в качестве атрибутов класса, но это только для примера).
class Rectangle:
def __init__(self, corners: Tuple[Tuple[float, float]], **kwargs):
self.x, self.z = corners[0][0], corners[0][1]
self.elements = {
'front': Line(corners[0], corners[1]),
'left': Line(corners[0], corners[2]),
'right': Line(corners[1], corners[3]),
'rear': Line(corners[3], corners[2]),
'cog': calc_cog(corners),
'area': calc_area(corners),
'pins': None
}
class Line:
def __init__(self, p1: Tuple[float, float], p2: Tuple[float, float]):
self.p1, self.p2 = p1, p2
self.vertical = p1[0] == p2[0]
self.horizontal = p1[1] == p2[1]
, когда я набираю, введитеследующий
rec1 = Rectangle(rec1_corners, show=True, name='Nr1')
rec1.sides['f...
Пихарм предложит мне 'front'
.Еще лучше, когда я сделаю
rec1.sides['front'].ver...
Pycharm предложит .vertical
Так что Pycharm запоминает ключи из буквенного объявления словаря в классе __init__
, а также ожидаемые их значениятипы.Или скорее: он ожидает, что любое значение будет иметь любой из типов, которые есть в буквальном объявлении - вероятно, так же, как если бы я сделал self.elements = {} # type: Union[type1, type2]
.В любом случае, я нахожу это очень полезным.
Если у ваших функций есть подсказки по типу выходов, Pycharm также примет это во внимание.
Итак, предполагая, что в примере Rectangle
выше, я хотел бы указать, что pins
список Pin
объектов ... если бы pins
был обычным атрибутом класса, это было бы
self.pins = None # type: List[Pin]
(при условии, что необходимые операции импорта были выполнены)
Есть лиспособ дать ту же подсказку типа в объявлении литерала словаря?
Следующее не достигает того, что я ищу:
Добавление подсказки типа Union[...]
в конце буквального объявления?
'area': calc_area(corners),
'pins': None
} # type: Union[Line, Tuple[float, float], float, List[Pin]]
Добавление подсказки типа к каждой строке:
'area': calc_area(corners), # type: float
'pins': None # type: List[Pin]
}
Есть ли лучший метод для такого рода вещей?
Еще немного предыстории:
Я работаю с python в pycharm и широко использую набор текста, поскольку это помогает мне прогнозировать и проверять мою работу по мере продвижения.Когда я создаю новые классы, я также иногда выбрасываю некоторые менее часто используемые свойства в словарь, чтобы избежать загромождения объекта слишком многими атрибутами (это полезно в режиме отладки).