python中嵌套if语句中的作用域
我正在写一小段代码,解析latex文件,并给出定义的newcommands。一个测试用例就是这个简单的latex文件:python中嵌套if语句中的作用域,python,if-statement,scope,Python,If Statement,Scope,我正在写一小段代码,解析latex文件,并给出定义的newcommands。一个测试用例就是这个简单的latex文件: % +--------------------------------------------------------------------+ % | | % | New particle stuff
% +--------------------------------------------------------------------+
% | |
% | New particle stuff |
% | |
% +--------------------------------------------------------------------+
\newcommand*{\Hmp}{\ensuremath{H^{\mp}}\xspace}
\newcommand*{\susy}[1]{\ensuremath{\tilde{#1}}\xspace}
\newcommand*{\susy2}[1,2]{\ensuremath{\tilde{#1}\tilde{#2}}\xspace}
可能有一种更复杂的情况,命令会扩展几行,因此我需要跟踪不同的步骤,比如命令是否需要增加更多行,或者命令何时完成并准备完成
问题是,在几个嵌套的if/else语句中,变量的范围似乎丢失了,变量不再更新。以下是我正在做的事情:
macros = []
warg_keep = re.compile("newcommand\*\{(.*)\}\[(.*)\]\{(.*)")
woarg_keep = re.compile("newcommand\*\{(.*)\}\{(.*)")
warg_one = re.compile("newcommand\*\{(.*)\}\[(.*)\]\{(.*)\}")
woarg_one = woarg = re.compile("newcommand\*\{(.*)\}\{(.*)\}")
keep = False
for line in open(file).readlines():
line = line.strip()
if len(line) == 0 or line[0] == "%":
continue
if not keep:
newcommand = {"key":"","command":"","args":[]}
added = False
if "newcommand" in line:
if line[-1] == "%":
clean_line = line[0:-1]
keep = True
newcommand = get_cmd_from_line(warg_keep,woarg_keep,clean_line)
else:
newcommand = get_cmd_from_line(warg_one, woarg_one, line)
added = True
elif keep:
# Now it dos not matter how it ends, the command will always be added the line without the
# last character, it can be either % or } but it shouldn't be added
newcommand["command"] += line[0:-1]
# End the keep
if line[-1] != "%":
keep = False
added = True
elif added:
macros.append(newcommand)
问题是,当我将从get_cmg_from_line函数(我已经测试过该函数工作得很好)获得的值分配给newcommand变量时,它不会更新newcommand变量,但如果我将其移到上一个变量上,它会识别并更新它。keep和添加的变量也会发生同样的情况
我搜索了这个,找到了很多关于作用域/如果/函数等的东西,我一直都知道,因为如果不应该定义作用域,我不知道为什么会发生这种情况。。。我错过了什么愚蠢的事吗?我应该如何更新newcommand变量的值?因为它可能会随着新线的到来而更新。我看到的唯一解决方案是扁平化代码,但我希望这样维护它
编辑:我对原始代码做了一点修改,以适应文本的额外功能,但在不展平代码的情况下,它也不起作用。所以上面的代码不起作用,原因是我提到的。以下代码工作正常,并通过了所有测试:
macros = []
warg_keep = re.compile("newcommand\*\{(.*)\}\[(.*)\]\{(.*)")
woarg_keep = re.compile("newcommand\*\{(.*)\}\{(.*)")
warg_one = re.compile("newcommand\*\{(.*)\}\[(.*)\]\{(.*)\}")
woarg_one = woarg = re.compile("newcommand\*\{(.*)\}\{(.*)\}")
keep = False
for line in open(file).readlines():
line = line.strip()
if len(line) == 0 or line[0] == "%":
continue
if not keep:
newcommand = {"key":"","command":"","args":[]}
added = False
if "newcommand" in line and line [-1] == "%":
clean_line = line[0:-1]
keep = True
newcommand = get_cmd_from_line(warg_keep,woarg_keep,clean_line)
if "newcommand" in line and line[-1] != "%":
newcommand = get_cmd_from_line(warg_one, woarg_one, line)
added = True
if not "newcommand" in line and keep:
# Now it dos not matter how it ends, the command will always be added the line without the
# last character, it can be either % or } but it shouldn't be added
newcommand["command"] += line[0:-1]
if not "newcommand" in line and keep and line[-1] != "%":
# End the keep
keep = False
added = True
if added:
macros.append(newcommand)
Python中局部变量的作用域(与许多其他脚本语言一样)是函数级的,而不是块级的 例如:
def function():
x = 5
if True:
y = 8
print(x)
print(y)
function()
# -> 5
# -> 8
Python中局部变量的作用域(与许多其他脚本语言一样)是函数级的,而不是块级的 例如:
def function():
x = 5
if True:
y = 8
print(x)
print(y)
function()
# -> 5
# -> 8
粗略检查一下,我的第一个猜测是
elif keep
和elif added
应该分别是if keep
和if added
另一种可能是,您希望newcommand从一行累积到下一行,但每次传递时都会重置它。粗略检查时,我的第一个猜测是,
elif keep
和elif added
应该分别是if keep
和if added
另一种可能是,您希望newcommand从一行累积到下一行,但每次传递时都会重置它。是否应将
newcommand={…}
移动到for line in…:
前面?为了获得新命令,我需要检查该行。我一直在调试代码,它做了它应该做的事情,在这个意义上,它进入了块,调用了函数,并且正确地关联了newcommand(!!),但是在离开块之后,所有变量(newcommand,keep和added)仍然保留旧值。如果第[-1]==“%”行中的第一个设置为True
,脚本应该怎么做?它是否也应该放在elif keep
内,还是只放在下一行?因为这在Python中不起作用,正如答案中所提到的。不,如果keep设置为true,那么它应该只用于下一行,当“newcommand”在该行中并且keep应该设置为true时,情况就不是这样了。keep仅用于知道“newcommand”出现后的下一行是否应用于增加newcommand变量。作为mentioend,一步一步地调试代码,它按原样工作。变量赋值被记录在第二个块之外。如果我把它们移动到一个左右的位置,或者将代码展平,那么它就工作了。。。这就向我指出,我并不是对块中的作用域有什么不确定的,没有块作用域。所有局部变量都是函数作用域。不管你的问题是什么,它都不是作用域。我不确定问题是什么,但是将代码扁平化可以完美地工作。我将编辑问题和答案,以防有人能找出问题是什么,这真的很好知道。为了得到新的命令,我需要检查行。我一直在调试代码,它做了它应该做的事情,在这个意义上,它进入了块,调用了函数,并且正确地关联了newcommand(!!),但是在离开块之后,所有变量(newcommand,keep和added)仍然保留旧值。如果第[-1]==“%”
行中的第一个设置为True
,脚本应该怎么做?它是否也应该放在elif keep
内,还是只放在下一行?因为这在Python中不起作用,正如答案中所提到的。不,如果keep设置为true,那么它应该只用于下一行,当“newcommand”在该行中并且keep应该设置为true时,情况就不是这样了。keep仅用于知道“newcommand”出现后的下一行是否应用于增加newcommand变量。作为mentioend,一步一步地调试代码,它按原样工作。变量赋值被记录在第二个块之外。如果我把它们移动到一个左右的位置,或者将代码展平,那么它就工作了。。。这就向我指出,我并不是对块中的作用域有什么不确定的,没有块作用域。所有局部变量都是函数作用域。不管你的问题是什么,它都不是作用域。我不确定问题是什么,但是将代码扁平化可以完美地工作。我将编辑问题和答案,以防有人能找出问题所在。是的,我知道,这是我们希望这能起作用,但似乎在第二个区块内,变量无法识别。即使在pycharm中,它们也会显示为灰色,好像它们没有被使用。是的,我知道,这是我们,我希望这能起作用,但似乎在第二个街区内