Какие типы данных может содержать именованный кортеж в своих полях?
Я посмотрел здесь документацию по Python по именованным кортежам, и я не могу понять, какие допустимые типы данных они могут использовать. Или, может быть, это не совсем очевидно для меня.
Можно ли с уверенностью сказать, что он может принимать любые типы данных (например, int, float, string, tuple, list, dict и т. Д.)? Существуют ли типы данных, которые нельзя вставить в именованный кортеж?
Этот вопрос возник из-за моей необходимости иметь именованный кортеж с двумя списками. По сути, я пытаюсь сделать что-то вроде этого:
from Collections import namedtuple
list1 = [23,45,12,67]
list2 = [76,34,56,23]
TwoLists = namedtuple("TwoLists", ['x','y'])
tulist = TwoLists(x=list1, y=list2)
type(tulist)
<class '__main__.TwoLists'>
type(tulist.x)
<class 'list'>
print(tulist.x)
[23,45,12,67]
print(tulist.y)
[76,34,56,23]
И это, кажется, работает по крайней мере со списками.
Некоторый быстрый поиск в Google не привел ни к каким примерам, поэтому я добавил отрывок кода (из интерактивного режима python) для всех, кто пытается вставить списки в именованный кортеж и нуждается в примере.
3 ответа
Любой объект Python является допустимым. Если вы хотите принудительно указать определенные типы данных в именованном кортеже, вы можете создать класс, который наследует от именованного кортежа с указанными типами данных, следующим образом (взят из https://alysivji.github.io/namedtuple-type-hints.html):
редактировать: обратите внимание, что ниже работает только в Python 3.6+
from typing import List, NamedTuple
class EmployeeImproved(NamedTuple):
name: str
age: int
title: str
department: str
job_description: List
emma = EmployeeImproved('Emma Johnson',
28,
'Front-end Developer',
'Technology',
['build React components',
'test front-end using Selenium',
'mentor junior developers'])
редактировать: в 3.5, вы можете сделать это:
import typing
EmployeeImproved = typing.NamedTuple("EmployeeImproved",[("name",str),("age",int),("title",str),("department",str),("job_description",List)])
.. а в 3.4 и ранее я считаю, что вам не повезло (кто-то поправит меня, если я ошибаюсь)
Вот моя попытка ответить на основании документации:
"Именованные кортежи присваивают значение каждой позиции в кортеже и допускают более читаемый, самодокументируемый код. Они могут использоваться везде, где используются обычные кортежи, и они добавляют возможность доступа к полям по имени вместо индекса позиции". из https://docs.python.org/3/library/collections.html
"Элементы кортежа являются произвольными объектами Python" из https://docs.python.org/3/reference/datamodel.html
Если явно не указано, любой объект Python является допустимым.