Python 2.7 解析代码时如何绕过SyntaxError?

Python 2.7 解析代码时如何绕过SyntaxError?,python-2.7,tkinter,Python 2.7,Tkinter,我正在使用openpyxl读取一个excel文件,该文件的值会随着时间的推移而变化。以下函数将从excel工作表中获取字符串输入,为Tkinter生成框架 def make_new_frame(strng, frame_location, frame_name, frame_list): if not(frame_name in frame_list): frame_list.append(frame_name) exec("global %s" %(fr

我正在使用openpyxl读取一个excel文件,该文件的值会随着时间的推移而变化。以下函数将从excel工作表中获取字符串输入,为Tkinter生成框架

def make_new_frame(strng, frame_location, frame_name, frame_list):
    if not(frame_name in frame_list):
        frame_list.append(frame_name)
        exec("global %s" %(frame_name)) in globals()
        exec("%s = Frame(%s)"%(frame_name, frame_location))
。。。。等 代码本身很长,但我认为这足以解决我的问题

现在,这会在解析时导致以下错误:

SyntaxError:函数“make_new_frame”使用import*和bare exec,这是非法的,因为它是嵌套函数

我包含的代码中的所有内容都被解析并执行了好几次,但是在我在这个函数的后续版本中添加了几行之后,它在执行代码之前不断地吐出上面的错误。这个错误引用了函数中的第三行,我重复一下,它在过去已经被清除了

我在另一篇SO帖子中建议添加globals,所以该解决方案不起作用。 有一个在线解决方案使用setattr,我不知道如何在不使用exec的情况下使用setattr创建小部件。 如果有人能告诉我如何在解析时绕过错误,或者为一组动态变化的帧名称提供一种替代方法,我将不胜感激

简要说明:

我知道在python中将变量设置为全局变量通常会受到警告,但我很确定它对我的代码很有用 编辑1:我不知道为什么这被否决了。如果我做了一些不正确的事情,请告诉我是什么,以便我以后避免这样做。

我认为这是一个错误。您是在寻求解决方案Y的帮助,而不是在问题X上寻求帮助

如果您的目标是基于外部数据创建数量未知的框架对象,则可以将对框架的引用存储在列表或字典中,而无需使用exec和动态创建的变量名

exec是一个非常好的函数,但在您完全理解为什么永远不应该使用它之前,它是一个永远不应该使用的函数

以下是如何在不使用exec的情况下解决实际问题:

frames = {}
def make_new_frame(strng, frame_location, frame_name, frames):
    if not(frame_name in frames):
        frames[frame_name] = Frame(frame_location)
    return frames[frame_name]
这样,您现在就有了一个字典框架,其中包括每个新框架的名称引用。例如,如果您有一个名为foo的框架,您可以如下配置和打包它:

frames["foo"].configure(background="red", ...)
frames["foo"].pack(...)

如果保持帧的顺序很重要,可以使用

1:您没有提供足够的代码来重新创建错误我知道它必须是一个嵌套函数才能获得该错误2:请使用字典来存储动态名称,而不是变量space={};space[frame\u name]=Frameframe\u location从执行可能来自其他源的代码中动态修改全局范围是一个非常糟糕的主意。老实说:在发现dict对象类型之前,我尝试过做同样的事情,事实上,这是globals返回的内容。如果您试图从大多数特殊情况中打断几行,那么这些特殊情况不足以打破规则。应该有一种——最好只有一种——显而易见的方法来做到这一点。所以,如果它告诉你你试图做的事情是非法的,那可能有一个很好的理由。你的代码不仅可怕,而且不完整。SyntaxerError已经告诉你做错了什么。我将投票结束这场比赛。