Comments 13
Ответ: Тогда, когда они помогают писать чище, читабельнее и делают код более лёгким в сопровождении, ну и ваще я так щитаю.
Достойно КО.
Интересно посмотреть на пример, когда namedtuple сделали код чище по сравнению со словарями.
На счёт чище не уверен, хотя бы это уродство с нарушением конвенции именования методов
In addition to the methods inherited from tuples, named tuples support three additional methods and two attributes. To prevent conflicts with field names, the method and attribute names start with an underscore.
А методы index и count конфликтов не могут создать?
Но вот то, что namedtuple легче чем словарь или экземпляр любого пользовательского класса — это факт.
Named tuple instances do not have per-instance dictionaries, so they are lightweight and require no more memory than regular tuples.
А также с ним удобно возвращать кортежи из функций.
https://docs.python.org/3/reference/datamodel.html#slots
Думаю, что сравнимо. Про __slots__
я не стал уж упоминать, довольно экзотическая штука. А вы часто это используете?
Вид car.color выглядит гораздо компактнее, чем car['color'].
При опечатке легче найти ошибку. Если вы написали car.coloor, то IDE может вам показать ошибки, с текстовыми ключами car['coloor'] такое может не получится.
Код ниже рабочий:
from collections import namedtuple
Machine = namedtuple('Car', ['a', 'b'])
machine = Machine(1, 2)
print(machine)
Только выводит:
Car(a=1, b=2)
Т.е. хотелось бы интеграции этого механизма прямо в интерпретаторе, а не «сбоку», как сейчас.
from typing import NamedTuple
class Man(NamedTuple):
name: str
age: int
weight: float
А с 3.6.1 ещё и методы стало можно добавлять без лишних плясок:
class Vector(NamedTuple):
x: float = 0.0
y: float = 0.0
def scale(self, amount: float) -> 'Vector':
return Vector(self.x * amount, self.y * amount)
Я не уверен, что правильно понял ваш вопрос.
Если вы о том, какие преимущества у класса, отнаследованного от NamedTuple по сравнению с обычным, то, на мой взгляд, основное преимущество в том, что он immutable. Плюс в качестве бонуса мы получаем __repr__
, __eq__
и __hash__
.
Т.е., это своеобразный аналог case class из Scala или data class из Kotlin.
Именованные кортежи. Пишем код на Python чище