尝试将if elif else语句与eval(input())函数一起使用

时间:2018-12-02 03:25:57

标签: python

我正在用Python构建RPG风格的基于文本的游戏,但我陷入了困境。我试图要求用户输入并在代码中使用它来选择玩家的角色和种族。我把所有种族作为一个阶级,把所有阶级作为一个阶级。

这里是一个例子:

class Human:
    hp = 50
    dg = 10
    ar = .1
    cs = .05
    ak = 5
    ev = 0.1

class Elf:
    hp = 20
    dg = 20
    ar = .1
    cs = .2
    ak = 15
    ev = 0.15

def race_sel():
    y = eval(input("Select Race: Human, Elf").capitalize())
    return y

x = race_sel()

class Mage(x):
    hp = 80 + x.hp
    dg = 20 + x.dg
    ar = .15 + x.ar
    cs = .1 + x.cs
    ak = 40 + x.ak
    ev = .15 + x.ev

class Warrior(x):
    hp = 100 + x.hp
    dg = 20 + x.dg
    ar = .2 + x.ar
    cs = .1 + x.cs
    ak = 30 + x.ak
    ev = .15 + x.ev

def char_sel():
    y = eval(input("Select Class: Mage, Warrior").capitalize())
    return y

q = char_sel()

此半有效。在控制台中,它会询问“字符串”,然后如果我键入,则是人类还是精灵,它会.capitalize()输入,并将x设置为所选的类。然后,将x插入Mage(x)Warrior(x)中的一个类中。然后它将x.whatever添加到所选的类。

然后,char_sel():函数选择角色正在播放的类。

我遇到的问题是我想在函数race_sel()class_sel()中使用if else语句,如果用户输入的不是“人类”或“小精灵”,则打印“无效”。选择,然后重试”,但似乎与eval()一起使用代码中包含的所有Python类自动检查您的输入。因为eval()将其更改为str类型。

我可以输入一个字符串,然后将其转换为eval()类型吗?我对eval()方法真的不是很熟悉。这只是我发现的东西,因此我可以使用用户控制台输入来调用类。

我敢肯定,有一种更简便的方法可以完成我正在编写的大部分内容。

2 个答案:

答案 0 :(得分:1)

使用eval is generally bad practice。最好这样做(它也可以解决您的问题):

def race_sel():
    while True:
        # the .lower() allows user to input hUmAn or something and it will still work
        type = input('Select Race: Human, Elf ').lower()
        if type == 'human':
            return Human
        elif type == 'elf':
            return Elf
        else:
            print('Invalid selection, try again')

char_sel使用类似的过程。

顺便说一句,没有eval类型的东西。如果成功,eval将返回一个典型的Python对象(类型取决于eval的参数内容。)

答案 1 :(得分:1)

我了解使用内省来避免重复自己的吸引力。不要使用eval(),只需检查用户输入的内容是否在globals()中即可。

def race_sel():
    prompt = "Select race: Human, Elf "
    race = input(prompt).capitalize()
    while race not in globals():
        print(race, "is not a valid race. Try again.")
        race = input(prompt).capitalize()
    return globals()[race]

对于进一步的不重复活动,请从基类派生所有类,然后使用isinstance()确保用户实际上已经参加了有效的比赛。 (或者,您可以将所有种族都放在Race类中,而将外部种族简单地用作命名空间。)您还可以使用自省功能动态生成提示,因此定义新种族自动更新菜单。