Создать вложенную структуру данных и быстрый доступ из другого модуля при наборе (Python) - PullRequest
0 голосов
/ 13 февраля 2020

Здравствуйте :) Я использую два модуля в Python: Модуль 1 (для создания вложенной структуры данных) и Модуль 2 (для доступа к «полям» структуры и, что очень важно, я хочу Python чтобы показать мне поля во время ввода в модуле 2, так как в модуле 1 будет много полей). Вложенная структура выглядит так:

NAME A
    value: 5
    NAME B
        value:  6
        NAME B2
            Value:76
    NAME C
        Index: 78

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

from collections import namedtuple   
def ModbusDiction():

        NameA = namedtuple('NameA', ['value','NameB','NameC'])
        NameB = namedtuple('NameB', ['value','NameB2'])
        NameB2 = namedtuple('NameB2','value')
        NameC = namedtuple('NameC','index')
        NameC_value = NameC(78)
        NameB2_value = NameB2(76)
        NameB_value = NameB(6, NameB2_value)
        NameA_value = NameA(5,NameB_value,NameC_value)
        return NameA_value

Мой код в модуле 2 (Files_CommonUse.folder_ModbusIndex.indexModbus - путь к модулю 1):

import Files_CommonUse.folder_ModbusIndex.indexModbus as index_modbus
indexmodbus = index_modbus.ModbusDiction()
print(indexmodbus.NameB.NameB2.value)

Результат печати 76, так что это работает. Однако, пока я набирал indexmodbus. , «поле» NameA не появилось. Пока я набирал indexmodbus.NameA. , мне бы хотелось, чтобы мне показывали значение , ИмяB или Имя C, но ничего не отображалось. Интересно, стал ли этот именованный кортеж изменчивым? Кстати, я использую Eclipse.

Пожалуйста, кто-нибудь может мне помочь в этом? :) Возможно, идея именованного кортежа не работает в моих интересах, или я использую концепцию неправильно: S

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Поскольку именованные кортежи являются своего рода легковесным объектом, они ведут себя как объекты. Это означает, что NameA_value является экземпляром объекта кортежа NameA, и если вы возвращаете этот экземпляр из функции, новая переменная становится этим экземпляром. Таким образом, ваш indexmodbus является экземпляром объекта кортежа NameA. Если вы хотите сделать: indexmodbus.NameA, вам нужен еще один шаг выше NameA, тогда ваша функция может выглядеть так:

def ModbusDiction():

        TopTuple = namedtuple('top', ['NameA'])
        NameA = namedtuple('NameA', ['value','NameB','NameC'])
        NameB = namedtuple('NameB', ['value','NameB2'])
        NameB2 = namedtuple('NameB2','value')
        NameC = namedtuple('NameC','index')
        NameC_value = NameC(78)
        NameB2_value = NameB2(76)
        NameB_value = NameB(6, NameB2_value)
        NameA_value = NameA(5,NameB_value,NameC_value)
        TopTuple_value = TopTuple(NameA_value)
        return TopTuple_value

Теперь вы можете получить доступ к NameA с помощью: indexmodbus.NameA et c.

0 голосов
/ 13 февраля 2020

Я бы вместо этого использовал свой собственный класс для создания собственной структуры данных, потому что он более гибкий, чем namedtuples

def mod_bus_diction(**kwargs):
    return type('MyStructure', (), {**kwargs}) 


MyStructure = mod_bus_diction(
    value=5,
    NameB=mod_bus_diction(
        value=6,
        NameB2=mod_bus_diction(
            value=76
        )
    ),
    NameC=mod_bus_diction(
        index=78
    )
)

Я проверил его на терминале ipython, он предлагал значения и свойства. Кстати, я не проверял затмение.

...