如何将索引列表的值存储在全局变量中,并通过格式化函数对其进行调用?

时间:2018-10-03 11:44:53

标签: python-3.x

如何存储索引的值,然后在格式化的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进行检查)还是无法以这种方式设置代码格式?但是无论如何我都需要解决。

1 个答案:

答案 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同样引起关注。