从字符串中检索 namedtuple 值

retrieving namedtuple value from string

我创建了一个这样的命名元组。

Named_Tuple_1 = namedtuple("Coordinates", ["x", "y", "z"], verbose=False, rename=False)

Point_1 = Named_Tuple_1(x=1, y=1, z=1)
Point_2 = Named_Tuple_1(x=2, y=2, z=2)
Point_3 = Named_Tuple_1(x=3, y=3, z=3)

我可以像这样轻松访问值。

Point_2.x

但是当我尝试从输入框中获取 Point_2 时出现此错误。

AttributeError: 'str' object has no attribute 'x'

所以我了解到输入框 return 字符串值。

如何从字符串中获取 namedtuple 值?

String_1 = "Point_2"
String_1 ???

谢谢。

抱歉造成混淆。希望这更清楚。

所以在这里我决定添加 Point_1.x 和 Point_2.x 并将总数作为标签添加到我的对话框中。

Named_Tuple_1 = namedtuple("Coordinates", ["x", "y", "z"], verbose=False, rename=False)
Point_1 = Named_Tuple_1(x=1, y=2, z=3)
Point_2 = Named_Tuple_1(x=4, y=5, z=6)
Point_3 = Named_Tuple_1(x=7, y=8, z=9)

def ADD_x_1():
    Sum_of_x = Point_1.x + Point_2.x
    My_Label_1 = Label(Dialog, text=Sum_of_x)
    My_Label_1.pack()

Dialog = Tk()
My_Button_1 = Button(Dialog, text="Add x Value", command=ADD_x_1)
My_Button_1.pack()
Dialog.mainloop()

现在我想做同样的事情,但要让用户决定添加哪个点。

def ADD_x_2():
    First_Point_x = My_Entry_1.get().x
    Second_Point_x = My_Entry_2.get().x
    Sum_of_x = First_Point_x + Second_Point_x
    My_Label_3 = Label(Dialog, text=Sum_of_x)
    My_Label_3.pack()

Dialog = Tk()
My_Label_1 = Label(Dialog, text="Select first point")
My_Label_1.pack()
My_Entry_1 = Entry(Dialog, bd=2, width=10)
My_Entry_1.pack()
My_Label_2 = Label(Dialog, text="Select second point")
My_Label_2.pack()
My_Entry_2 = Entry(Dialog, bd=2, width=10)
My_Entry_2.pack()
My_Button_2 = Button(Dialog, text="Add x Value", command=ADD_x_2)
My_Button_2.pack()
Dialog.mainloop()

我的问题是 My_Entry_1.get() 和 My_Entry_2.get() 是字符串。我收到错误 AttributeError: 'str' object has no attribute 'x'.

所以我的问题是如何从 My_Entry_1 和 My_Entry_2 中获取字符串来访问 x 值?

再次对造成的混乱表示抱歉。

谢谢。

你通常不会这样做(任意输入是不安全的),但你可以使用 eval:

String_1 = eval("Point_2")

现在,String_1 指向您已经存在的变量 Point_2

我不确定在这种情况下输入框是什么,但我认为您在这里有几个选择。

1) 将这些点输入字典并通过从输入框中返回的字符串对其进行索引。

point_dict = {'Point_1': Point_1, 'Point_2': Point_2, 'Point_3': Point_3}
entry_point = {{however you got the string from the entrypoint}}
point = point_dict[entry_point]
point.x

2) 如果这些在模块级别,您可以尝试从模块上下文中获取变量。

import sys
modname = globals()['__name__']
modobj  = sys.modules[modname]
point = getattr(modobj, 'Point_1')

3) 如果你想从一个函数中引用它,你可以试试 eval: https://docs.python.org/3/library/functions.html#eval 或者,更好的 locals(): https://docs.python.org/2/library/functions.html#locals

##Point_1 = eval('Point_1') risk due to executing arbitrary code
Point_1 = locals()['Point_1']  # Use this instead