Преобразование иерархии объектов из 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
... но я бы тоже порекомендовал словари.