Преобразование иерархии объектов из MATLAB в Python

Я конвертирую скрипт MATLAB в python. Сценарий MATLAB использует некоторую иерархию объектов для различных входных переменных, как в:

parameterA.subparameter1= A1;
parameterA.subparameter2= A2;

parameterB.subparameter1= B1;
parameterB.subparameter2= B2;

куда A1,A2,B1,B2 все могут быть строками и числами. Я хочу преобразовать это в Python, и я использовал

parameterA.subparameter1= A1
parameterA.subparameter2= A2

parameterB.subparameter1= B1
parameterB.subparameter2= B2

Теперь я получаю сообщение об ошибке:

NameError: имя 'parameterA' не определено

Я попытался инициализировать их, используя либо parameterA,parameterB=[],[], что не хорошо, потому что я хочу объекты, а не список или parameterA,parameterB=set(),set() в соответствии с этим постом, а также некоторые другие решения.

Это вообще правильный подход? Как мне инициализировать эту структуру? Есть лучший способ сделать это?

2 ответа

Решение

Я настоятельно рекомендую вам использовать dictвместо. Это эффективные и универсальные встроенные объекты в Python.

parameterA  = {'subparameter1': A1} # definition
parameterA['subparameter2'] = A2 # update/assignment

parameterB = {'subparameter1': B1, 'subparameter2': B2}

Как вы можете видеть, вы можете получить доступ и изменить значения, используя квадратные скобки. Если вы действительно настаиваете на использовании поиска атрибутов, вы можете использовать types.SimpleNamespace:

from types import SimpleNamespace

parameterA = SimpleNamespace(subparameter1=A1)
parameterA.subparameter2 = A2

parameterB = SimpleNamespace(subparameter1=B1, subparameter2=B2)

Основная причина, по которой я буду придерживаться диктов, - это простота динамического доступа к ключам. Используйте только SimpleNamespace или что-то подобное, если вы никогда не обращаетесь к атрибутам программно, потому что ваши объекты больше похожи на инструмент для группировки переменных. Вы по-прежнему можете обращаться к атрибутам программно, но это уродливее (и менее идиоматично), чем dict поиск предметов.

В документации по Python Engine для MATLAB вы можете найти неоднозначность классов в MATLAB для классов в Python.

Если вы хотите соответствовать документации, вы должны заменить структуры в MATLAB словарями на Python (как ответил Андрас Дик). Если вы хотите сохранить синтаксис для вызова структурных полей с помощью оператора точки, вы также можете определить классы в Python.

class parameterA: pass
class parameterB: pass

parameterA.subparameter1= A1
parameterA.subparameter2= A2

parameterB.subparameter1= B1
parameterB.subparameter2= B2

... но я бы тоже порекомендовал словари.

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