Какие типы данных может содержать именованный кортеж в своих полях?

Я посмотрел здесь документацию по 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 является допустимым.

Другие вопросы по тегам