У меня есть названный класс кортежа в Python
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
Я хотел бы преобразовать экземпляры Town в словари. Я не хочу, чтобы он был жестко привязан к именам или количеству полей в городе.
Есть ли способ написать это так, чтобы я мог добавить больше полей или передать совершенно другой именованный кортеж и получить словарь.
Я не могу изменить исходное определение класса, как в чужом коде. Поэтому мне нужно взять экземпляр Town и преобразовать его в словарь.
python
dictionary
tuples
namedtuple
Без меня это просто удивительно
источник
источник
dir
команду, которая покажет вам поля для любого объекта ... который бы показывал_asdict
функцию напрямую.dict
вместо namedtuple и передать namedtuple в инициализатор. Помните, что если вы привыкли к Cxx,class Town(x)
это не конструктор,def __init__(self, *args, **kwargs)
он внутри.dir
это просто встроенный Python ... вы можете запустить его на любом объекте Python, в консоли или в скрипте (где он возвращает список, который вы можете распечатать или сделать с чем угодно), и он вернет список (почти ) все атрибуты объекта. полезно, если вы пытаетесь понять, как работает неизвестный объект.Ответы:
TL; DR:
_asdict
для этого предусмотрен метод .Вот демонстрация использования:
Это документированный метод именованных кортежей, то есть, в отличие от обычного соглашения в python, подчеркивание в имени метода не должно препятствовать использованию . Наряду с другими методами, добавленными в namedtuples
_make
,_replace
,_source
,_fields
, то есть подчеркивание только , чтобы попытаться предотвратить конфликты с возможными именами полей.Примечание. Для некоторого кода 2.7.5 <python версии <3.5.0 в открытом виде вы можете увидеть эту версию:
Некоторое время в документации упоминалось, что
_asdict
она устарела (см. Здесь ), и предлагалось использовать встроенный метод vars . Этот совет сейчас устарел; чтобы исправить ошибку, связанную с подклассами,__dict__
свойство, которое присутствовало в именованных кортежах, снова было удалено этим коммитом .источник
_asdict
что в стандартной библиотеке не должно быть псевдонимовasdict
?"asdict"
быть одним из имен кортежей.Там есть встроенный метод на
namedtuple
случаях для этого_asdict
.Как обсуждалось в комментариях, на некоторых версиях
vars()
это тоже будет делать, но, очевидно, это сильно зависит от деталей сборки, тогда как_asdict
должно быть надежным. В некоторых версиях_asdict
был помечен как устаревший, но комментарии указывают, что это не относится к 3.4.источник
_asdict
метод был устаревшим в python3 (в пользу vars)vars
он не работает в некоторых старых версиях - в 2.7 он вызывает aTypeError
, посколькуnamedtuple
класс этой версии не имеет__dict__
атрибута.В версиях python2.7 и python3.4 для Ubuntu 14.04 LTS
__dict__
свойство работало должным образом ._asdict
метод работал, но я склонен использовать стандартизированную определенные, обмундирование, свойство апи вместо локализованной неравномерной апи.$ python2.7
Видеть как dict - это семантический способ получить словарь, представляющий что-то (по крайней мере, насколько мне известно).
Было бы неплохо собрать таблицу основных версий и платформ Python и их поддержку
__dict__
, в настоящее время у меня есть только одна версия платформы и две версии Python, как указано выше.источник
__dict__
не работает.Случай № 1: одномерный кортеж
Случай № 2: двумерный кортеж
Пример: DICT_ROLES [961] # покажет «Back-End Programmer»
источник
если нет _asdict (), вы можете использовать этот способ:
источник
Python 3. Выделите любое поле для словаря в качестве обязательного индекса для словаря, я использовал «имя».
источник