从string中检索namedtuple值

时间:2016-02-19 20:22:09

标签: string python-3.x namedtuple

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

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'

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

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

String_1 = "Point_2"
String_1 ???

感谢。

很抱歉这个混乱。希望这更清楚。

所以在这里我决定使用Point_2.x添加Point_1.x并将总数添加到我的Dialog作为标签。

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'对象没有属性' x'。

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

再次抱歉让人感到困惑。

感谢。

2 个答案:

答案 0 :(得分: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 或者,甚至更好的本地人():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

答案 1 :(得分:0)

您通常不会这样做(unsafe任意输入),但您可以使用eval

String_1 = eval('Point_2")

现在它指向您已存在的变量Point_2

相关问题