String 从字符串中检索namedtuple值
我已经创建了一个这样的命名元组String 从字符串中检索namedtuple值,string,python-3.x,namedtuple,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 我可以像这样轻松地访问值 Nam
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
我可以像这样轻松地访问值
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
但是当我试图从一个输入框中获取点2时,我得到了这个错误
AttributeError: 'str' object has no attribute 'x'
所以我了解到输入框返回字符串值
如何从字符串中获取namedtuple值
String_1 = "Point_2"
String_1 ???
谢谢
很抱歉给你带来了困惑。希望这更清楚
所以在这里,我决定用点2.x添加点1.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()
我的问题是我的\u Entry\u 1.get()和我的\u Entry\u 2.get()是字符串。我得到的错误是AttributeError:'str'对象没有属性'x'
所以我的问题是如何从我的\u条目\u 1和\u条目\u 2中获取字符串来访问x值
再次为混乱感到抱歉
谢谢。您通常不会这样做(使用任意输入是不安全的),但您可以使用:
现在,它指向已经存在的变量
Point_2
您通常不会这样做(它是不安全的
任意输入),但您可以使用:
现在它指向您已经存在的变量
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:
或者,更好的本地人()
我不确定在这种情况下输入框是什么,但我认为您在这里有一些选择 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:
或者,更好的本地人()
这个很好用。我可以使用字符串_1.x从输入框中获取点_2的x值。但是你用这种不安全的方法吓唬我。我是一个编程新手,我不想把代码弄乱。如果我的namedtuple是固定的,并且永远不会改变,那么我使用这种方法好吗?@GrandJoss:
eval
可以执行任意Python代码,而不仅仅是查找变量,这就是为什么它不受欢迎的原因。使用由globals()
、locals()
或vars()
(取决于名称的位置)返回的dict
,意味着他们所能做的最糟糕的事情就是让您读取现有变量或引发KeyError
),其中eval
允许他们通过输入eval来删除工作目录中的所有文件[\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
稍微好一点,但我认为您可能需要重新考虑您的设计。我怀疑您是否需要执行其中任何一项来达到您的目的。也许可以详细说明您的问题,让我们知道您为什么尝试执行此操作。这很好。我可以使用字符串_1.x从输入框中获取点_2的x值。但是您用这种方法吓坏了我ing不安全。我是一个编码新手,我不想弄乱我的代码。如果我的命名元组是固定的,并且永远不会改变,我使用这种方法好吗?@GrandJoss:eval
可以执行任意Python代码,而不仅仅是查找变量,这就是为什么它不受欢迎的原因。使用globals()返回的dict
)
,locals()
或vars()
(取决于名称存在的位置)意味着他们所能做的最糟糕的事情就是让你读取一个现有变量或引发KeyError
,其中eval
允许他们,比如说,通过输入[\uuuu import\uuuuuuuuuo('os')来删除你工作目录中的所有文件。为x取消链接(x)为x in\uu import\uuuuuo('os')).listdir('.')]
而不是Point_2
@GrandJoss:正如@ShadowRanger所提到的,如果你不知道自己在做什么,这可能不是你想要的。本地人()稍微好一点,但我认为您可能需要重新考虑您的设计。我怀疑您是否需要执行其中任何一项来实现您的目标。也许可以详细说明您的问题,让我们知道您为什么要尝试执行此操作。我会将#3切换为使用locals()dict
overeval
因为你有一个准确的名字。避免了eval
的安全风险。而且,在#2中,你不需要全局文件
,你只需直接使用sys.modules[\uuuuu name\uuuuu]
,因为\uu name\uuuuu始终存在于模块中(除非你因为天知道什么原因在本地跟踪了它)。对不起,这就是我的意思。My#Entry=Entry(Dialog,width=10)。pack()@GrandJoss:像#1这样的东西几乎肯定是你想要尝试的。谢谢@ShadowRanger,我已经更新了我的答案,用locals()代替#3。我将#3切换为使用locals()dict
overeval
因为你有一个准确的名字。避免了eval
的安全风险。而且,在#2中,你不需要全局文件
,你只需直接使用sys.modules[\uuuuu name\uuuuu]
,因为\uu name\uuuuu始终存在于模块中(除非你因为天知道什么原因而在本地对它进行了跟踪。)对不起,这就是我的意思。My_Entry=Entry(Dialog,width=10)。pack()。