Как реализовать метаданные класса / объекта в Python? - PullRequest
1 голос
/ 05 октября 2011

Я работаю над структурой анализа структурированных данных, основанной на потоковой передаче данных между узлами .В настоящее время узлы реализованы как подклассы корневого класса Node, предоставляемого платформой.Для каждого класса / фабрики узлов мне нужны метаданные, такие как список атрибутов узла, их описание, вывод узла.Метаданные могут быть обоими: для конечных пользователей во внешнем приложении или для использования в программировании - некоторыми другими инструментами управления потоками.В будущем их будет больше.

(обратите внимание, что я только начал изучать python при написании этого кода)

В настоящее время метаданные представлены в переменной класса

class AggregateNode(base.Node):
    """Aggregate"""

    __node_info__ = {
        "label" : "Aggregate Node",
        "description" : "Aggregate values grouping by key fields.",
        "output" : "Key fields followed by aggregations for each aggregated field. Last field is "
                   "record count.",
        "attributes" : [
            {
                 "name": "keys",
                 "description": "List of fields according to which records are grouped"
            },
            {
                "name": "record_count_field",
                 "description": "Name of a field where record count will be stored. "
                                "Default is `record_count`"
            }
        ]
    }

Больше примеров можно найти здесь .

Я чувствую, что это можно сделать намного чище.Есть одно ограничение: поскольку узлы являются пользовательскими классами подклассов, должно быть минимальное вмешательство в потенциальные будущие имена атрибутов.

Я собирался разделить текущую node_info .Он должен был быть закрытым для фреймворка, но теперь я понимаю, что он имеет гораздо более широкое применение.Я думал об использовании атрибутов node_: будет иметь общее пространство имен атрибутов, не требующее слишком большого количества имен из потенциальных пользовательских атрибутов узла.

Мой вопрос: каков наиболее распространенный способ предоставления таких метаданных в программах на Python?Отдельная переменная со словарем?Несколько переменных, по одной для каждого атрибута метаданных?(это будет противоречить ограничению) Пользовательский класс / структура?Использовать какой-то префикс, например, node_ * и использовать несколько переменных?

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Многие описываемые вами функции перекрываются с epydoc :

>>> class AggregateNode(base.Node):
...     r"""
...     Aggregate values grouping by key fields.
... 
...     @ivar keys: List of fields according to which records are grouped
... 
...     @ivar record_count_field: Name of a field where record count will be
...                               stored.
...     """
...     record_count_field = "record_count"
...     
...     def get_output(self):
...         r"""
...         @return: Key fields followed by aggregations for each aggregated field.
...                  Last field is record count.
...         """
... 
>>> import epydoc.docbuilder
>>> api = epydoc.docbuilder.build_doc(AggregateNode)
>>> api.variables['keys'].descr.to_plaintext(None)
u'List of fields according to which records are grouped\n\n'
>>> api.variables['record_count_field'].value.pyval
'record_count'
1 голос
/ 05 октября 2011

Я не уверен, существует ли какой-то "стандартный" способ хранения пользовательских метаданных в объектах python, но, например, реализация dbus на python добавляет атрибуты с префиксом "_dbus" опубликованным методам и сигналам.

0 голосов
/ 31 августа 2012

Единственный элемент класса Python, способный изменить само определение класса (следовательно, метаданные), - это функция __new__(), new вызывается до того, как объект фактически создан, и до того, как инициирован. Вы можете использовать его для чтения / изменения внутренней структуры ваших классов / узлов, прежде чем они будут инициализированы с __init__()

...