创建嵌套数据结构,并在键入(Python)时从另一个模块快速访问

2024-09-27 21:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

您好:)我在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中的代码(文件\u CommonUse.folder\u ModbusIndex.indexModbus是模块1的路径)是:

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

打印的结果是76,所以它工作正常。然而,当我输入indexmodbus时,“字段”名称a未出现。当我输入indexmodbus.NameA时,我希望显示名称b名称c,但什么也没有显示。我想知道这个命名元组是否变了。顺便说一下,我正在使用Eclipse

求求你,有谁能帮我这个忙吗?:)也许命名元组的想法不符合我的兴趣,或者我用了一种错误的方式:S


Tags: 模块代码name名称indexvaluenamedtuple结构
2条回答

我会使用我的自定义类来创建我的自定义数据结构,因为它比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终端上检查了它,它建议使用值和属性。顺便说一下,我没有检查eclipse

由于命名元组是一种轻量级对象,它们的行为类似于对象。这意味着,NameA_valueNameA元组对象的实例化,如果从函数返回该实例,新变量将成为该实例。因此,您的indexmodbusNameA元组对象的实例。 如果要执行: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

现在您可以使用:indexmodbus.NameA等访问NameA

相关问题 更多 >

    热门问题