Перечислить членов структуры?

Не рекомендуется (больше не) создавать подкласс; функции json.dump() и json.dumps() принимают функцию default:

def decimal_default(obj):
    if isinstance(obj, decimal.Decimal):
        return float(obj)
    raise TypeError

json.dumps({'x': decimal.Decimal('5.5')}, default=decimal_default)

Демонстрация:

>>> def decimal_default(obj):
...     if isinstance(obj, decimal.Decimal):
...         return float(obj)
...     raise TypeError
... 
>>> json.dumps({'x': decimal.Decimal('5.5')}, default=decimal_default)
'{"x": 5.5}'

Код, который вы обнаружили, работал только на Python 2.6 и переопределяет закрытый метод это больше не вызывается в более поздних версиях.

5
задан Mike 20 May 2009 в 15:30
поделиться

6 ответов

Чтобы констатировать очевидное, в C или C ++ нет отражения. Следовательно, нет надежного способа перечисления переменных-членов (по умолчанию).

Если у вас есть контроль над структурой данных, вы можете попробовать std :: vector или std :: map , затем добавьте все свои переменные-члены в вектор / карту.

Конечно, это означает, что все ваши переменные, скорее всего, будут находиться в куче, поэтому такой подход снизит производительность. С подходом std :: map это означает, что у вас будет своего рода отражение "бедняка".

4
ответ дан 13 December 2019 в 19:34
поделиться

Вы можете указать свои типы в промежуточном файле и сгенерировать из него код C ++, что-то вроде классов COM можно сгенерировать из файлов idl. Сгенерированный код обеспечивает возможности отражения для этих типов.

Я сделал нечто похожее двумя разными способами для разных проектов:

  • пользовательский файл, проанализированный сценарием Ruby для генерации
  • , определяет типы как типы C # используйте отражение C #, чтобы получить всю информацию и сгенерировать C ++ из этого (звучит запутанно, но работает на удивление хорошо, а запись определений типов очень похожа на запись определений C ++)
3
ответ дан 13 December 2019 в 19:34
поделиться

Boost имеет готовую к использованию библиотеку Variant , которая может удовлетворить ваши потребности.

2
ответ дан 13 December 2019 в 19:34
поделиться

Самый простой способ - перейти на Objective-C ИЛИ Objective-C ++. Эти языки обладают хорошим самоанализом и полностью совместимы с исходными текстами C / C ++.

также Вы можете использовать m4 / cog / ... для одновременной генерации структуры и его описания из некоторого метаописания.

2
ответ дан 13 December 2019 в 19:34
поделиться

Поскольку C ++ не имеет встроенного отражения, вы можете получить информацию, только обучая вашу программу отдельно о содержимом структуры.

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

0
ответ дан 13 December 2019 в 19:34
поделиться

Такое ощущение, что вы создаете какой-то отладчик. Я думаю, это должно быть выполнимо, если вы убедитесь, что вы генерируете файлы pdb при создании исполняемого файла.

Не уверен, в каком контексте вы хотите выполнить это перечисление, но в вашей программе вы должны иметь возможность вызывать функции из Microsoft dbghelp.dll для получения информации о типе из переменных и т. Д. (Я предполагаю вы используете окна, что, конечно, может быть не так)

Надеюсь, это поможет вам немного продвинуться вперед.

Ура!

Я думаю, это должно быть выполнимо, если вы убедитесь, что вы генерируете файлы pdb при создании исполняемого файла.

Не уверен, в каком контексте вы хотите выполнить это перечисление, но в вашей программе вы должны иметь возможность вызывать функции из Microsoft dbghelp.dll для получения информации о типе из переменных и т. Д. (Я предполагаю вы используете окна, что, конечно, может быть не так)

Надеюсь, это поможет вам немного продвинуться вперед.

Ура!

Я думаю, это должно быть выполнимо, если вы убедитесь, что вы генерируете файлы pdb при создании исполняемого файла.

Не уверен, в каком контексте вы хотите выполнить это перечисление, но в вашей программе вы должны иметь возможность вызывать функции из Microsoft dbghelp.dll для получения информации о типе из переменных и т. Д. (Я предполагаю вы используете окна, что, конечно, может быть не так)

Надеюсь, это поможет вам немного продвинуться вперед.

Ура!

0
ответ дан 13 December 2019 в 19:34
поделиться