如何存储索引的值,然后在格式化的exec函数中使用该值向我显示类Animal():
Dog
下的每个列表的第二个结果,这是我期望的打印。我的问题本质的简化版本,以及下面的进一步说明:
class Global():
str_list = []
current_word = ""
adj_word = 'poofy'
adj_int = 0
size = 0
pounds = 0
dog_years = 0
class Animal():
##### Formatted like so:[[visual size],[pounds],[age in dog years],[almost dead]] #####
dog = [['small', 'poofy'],[7, 45],[18, 101],[0, 1]]
input = 'dog'
def done():
print(Global.adj_int)
print(str(Global.size), str(Global.pounds), str(Global.dog_years))
def split_str():
Global.str_list = input.split()
split_str()
def analyze():
Global.current_word = Global.str_list.pop(0)
exec(f"""if Global.adj_word in Animal.{Global.current_word}[0]:
Global.adj_int = Animal.{Global.current_word}[0].index('{Global.adj_word}')
Global.size = Animal.{Global.current_word}[1][{Global.adj_int}]
Global.pounds = Animal.{Global.current_word}[2][{Global.adj_int}]
Global.dog_years = Animal.{Global.current_word}[3][{Global.adj_int}]""")
if len(Global.str_list) == 0:
done()
analyze()
它返回:
1
7 18 0
当我希望它返回"45 101 1"
的大小,磅数dog_years
时,因为我将.index
列表中'poofy'
的{{1}}值存储在{ {1}}。在这种情况下为Animal.dog
。然后,我尝试格式化代码,以便它使用该值来打印每个列表的第二个值,但是由于某种原因,它将不打印预期的结果(在Global.adj_int
下。有人对此问题有答案吗?是我最初拥有的版本的简单得多的版本,但产生的结果完全相同。当我尝试使用格式化的代码时,它的作用就好像'1'
一样,实际上是def analyze():... exec(f"""...
(而且我知道它已经存储了像1一样应该是因为我在末尾打印adj_int进行检查)还是无法以这种方式设置代码格式?但是无论如何我都需要解决。
答案 0 :(得分:0)
问题在于,exec
的字符串参数在执行之前就已被求值。因此,当您呼叫exec
时,这就是所谓的:
exec(f"""if Global.adj_word in Animal.dog[0]:
Global.adj_int = Animal.{dog}[0].index('poofy')
Global.size = Animal.dog[1][0]
Global.pounds = Animal.dog[2][0]
Global.dog_years = Animal.dog[3][0]""")
然后 之后,Global.adj_int
变成1
。与简单性相比,代码的控制流和结构非常复杂,因此我会仔细考虑其设计,但是为了快速解决,您可能想要首先执行设置adj_int
的部分,然后执行其余部分,就像这样:
exec(f"""if Global.adj_word in Animal.{Global.current_word}[0]:
Global.adj_int = Animal.{Global.current_word}[0].index('{Global.adj_word}'"""))
exec(f"""if Global.adj_word in Animal.{Global.current_word}[0]:
Global.size = Animal.{Global.current_word}[1][{Global.adj_int}]
Global.pounds = Animal.{Global.current_word}[2][{Global.adj_int}]
Global.dog_years = Animal.{Global.current_word}[3][{Global.adj_int}]""")
即使在说明您的程序不必要地复杂之后,我还要指出,使用全局可变状态是一种非常糟糕的做法,这会使您的程序难以遵循,维护和调试。使用exec
同样引起关注。