从字符串中检索 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
我创建了一个这样的命名元组。
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