Обрабатывать недопустимые имена полей при разборе python dict для matlab через struct - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь преобразовать Python dict в структуру Matlab следующим образом:

pyClass = py.someClass.someSubClass();
data = x.someFunction();
data = struct(data);

Обычно это работает нормально, однако Matlab выдает следующую ошибку:

Error using py.dict/struct
Invalid field name "yyy/xxx"

Iзнать, что Matlab требует, чтобы следующие три условия были действительными для имен полей:

  • начинаются с буквы, в противном случае присвоение этому полю приведет к ошибке

  • содержать только буквы, цифры и / или символ подчеркивания,
    в противном случае присвоение этому полю приведет к ошибке,

  • и не должно превышать namelengthmax (в настоящее время 63) символа, в противном случаевы получите предупреждение, а имя поля будет усечено

Кто-нибудь знает, как я могу справиться с этой ошибкой - то есть есть небольшая функция Python, которую я могу вызвать из Matlab, чтобы удалить недопустимыйсимволы?

Вот фрагмент того, как выглядит диктон Python (в данном случае "/" является проблемой):

data = 

Python dict with no properties.

{'BTC/USD': {'fee_loaded': False, 'percentage': True, 'tierBased': True, 'maker': 0.001, 'taker': 0.002, 'tiers': {'taker': [[0, 0.002], ...

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

На самом деле, я думаю, что лучший инструмент, который вы могли бы использовать в этом случае, это функция makeValidName . Это встроенная функция Matlab, которая позволяет выполнять очистку строк, преобразовывая их в значения, соответствующие соглашениям об именах.

Вы можете вызвать его либо из Python (если вы знаете, как обернуть код Matlab в такую ​​другую структуру), либо из своего кода Matlab в качестве первого шага перед началом манипулирования строками.

Вот пример, взятый из официальной документации:

S = {'Item_#' 'Price/Unit' '1st order' 'Contact'};
[N,M] = matlab.lang.makeValidName(S)

А вот и вывод:

N =
  1×4 cell array
    'Item__'    'Price_Unit'    'x1stOrder'    'Contact'

M =
  1×4 logical array
   1   1   1   0

Функция может быть настроена и параметризована в соответствии с вашими потребностями.

0 голосов
/ 08 мая 2018

Я решил эту проблему, преобразовав dict внутри python в json, а затем вывел json в matlab, где я затем декодировал данные, чтобы получить окончательную структуру, которая до сих пор прекрасно работала для меня. Вот решение, которое я придумал:

pyClass = py.someClass.someSubClass();
data = x.someFunction();
data = py.json.dumps(data);
data = char(data);
data = jsondecode(data);
0 голосов
/ 07 мая 2018

Если я понимаю требования к имени поля, имя поля yyy / xxx недопустимо, так как «/» не является буквой, цифрой или «_». Без дополнительной информации о том, что находится в dict и областях, которые вы пытаетесь связать. Следующий пример кода может быть использован для обнаружения этой ошибки, если предположить, что 'Invalid' - это тип ошибки, который может быть исключением из библиотеки matlab, которое вам нужно будет импортировать:

try:
    data = struct(data)
except Invalid as e:
    --Do something to alleviate the issue--

без дополнительной информации о том, что находится внутри словаря, я не могу помочь написать код для исключения. Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...