我正在尝试创建一个字典,其中名称来自变量。
这是因为可能有更好的方法: 我使用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 AW_OBJECT_NUMBER,
232 AW_OBJECT_X,
233 AW_OBJECT_Y,
234 AW_OBJECT_Z,
239 AW_OBJECT_DESCRIPTION,
231-234是整数,239是字符串
答案 0 :(得分: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
文件)。
答案 1 :(得分:0)
如果变量是在本地范围内定义的,那就简单如下:
obj_names = {}
while True:
varname = read_name()
if not varname: break
obj_names[varname] = locals()[varname]
答案 2 :(得分: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