1

我正在尝试创建一个名称来自变量的字典。

这是这种情况,因为也许有更好的方法:我使用 API 来获取“对象”的属性。(名称,描述,X,Y,Z)等。我想以一种通过“对象”保存数据的方式存储这些信息。

为了获取此信息,API 会遍历所有“对象”。

所以我的建议是,如果对象名称是我想要“捕获”的名称之一,我想创建一个具有该名称的字典,如下所示:

ObjectName = {'Description': VarDescrption, 'X': VarX.. etc}

(我说"Varetc..."那将是 API 传递的该属性的值。

现在,由于我提前知道了名称列表,我可以使用一个很长的 If 树,但我正在寻找更容易编码的东西来完成这个。(并且无需添加太多代码即可扩展)

这是我的代码:

def py_cell_object():
    #object counter - unrelated to question
    addtototal()
    #is this an object I want?
    if aw.aw_string (239)[:5] == "TDT3_":
        #If yes, make a dictionary with the object description as the name of the dictionary.
        vars()[aw.aw_string (239)]={'X': aw.aw_int (232), 'Y': aw.aw_int (233), 'Z': aw.aw_int (234), 'No': aw.aw_int (231)}
        #print back result to test
        for key in aw.aw_string (239):
            print 'key=%s, value=%s' % (key, aw.aw_string (239)[key])

这里是前两行代码来显示什么是“aw”

from ctypes import *
aw = CDLL("aw")

解释 API 调用中的数字是什么:

第231章

第232章

第233章

第234章

第239章

231-234 是整数,239 是字符串

4

3 回答 3

2

我推断您正在使用Active Worlds SDK。在未来的问题中首先提及这一点将节省时间。

我猜你的目标是创建一个顶级字典,其中每个键都是对象描述。每个值都是另一个字典,存储该对象的许多属性。

我快速浏览了 wiki 上的 AW SDK 文档,但没有找到向 SDK 询问属性名称、ID 和类型列表的方法。因此,您将不得不以某种方式在程序中对该信息进行硬编码。除非您在其他地方需要它,否则最简单的方法是在您创建字典的地方对其进行硬编码,这就是您已经在做的事情。要打印出来,只需打印属性字典的repr. 我可能会更像这样格式化您的方法:

def py_cell_object():
    #object counter - unrelated to question
    addtototal()

    description = aw.aw_string(239)
    if description.startswith("TDT3_"):
        vars()[description] = {
            'DESCRIPTION': description,
            'X': aw.aw_int(232),
            'Y': aw.aw_int(233),
            'Z': aw.aw_int(234),
            'NUMBER': aw.aw_int (231),
            ... etc for remaining attributes
        }

        print repr(vars()[description])

有些人会争辩说您应该为数字 232、233、234 等创建命名常量,但我认为没有理由这样做,除非您在多个地方需要它们,或者除非很容易从 SDK 自动生成它们(例如例如,通过解析.h文件)。

于 2013-06-20T05:19:46.443 回答
0

如果变量是在本地范围内定义的,则很简单:

obj_names = {}
while True:
   varname = read_name()
   if not varname: break
   obj_names[varname] = locals()[varname]
于 2013-06-20T05:19:49.677 回答
0

这是我在生产环境中使用的实际代码

希望能帮助到你。

        cveDict = {}
        # StrVul is a python list holding list of vulnerabilities belonging to a report
        report = Report.objects.get(pk=report_id)
        vul = Vulnerability.objects.filter(report_id=report_id)
        strVul = map(str, vul)
        # fill up the python dict, += 1 if cvetype already exists
        for cve in strVul:
            i = Cve.objects.get(id=cve)
            if i.vul_cvetype in cveDict.keys():
                cveDict[i.vul_cvetype] += 1
            else:
                cveDict[i.vul_cvetype] = 1
于 2013-06-20T05:29:47.820 回答