为什么PyCharm给我一个未解析的引用NameError

时间:2017-09-13 20:35:51

标签: python scripting

我正在学习Python学习。我写了下面你看到的代码:

creatures = []

def get_creature_race():
    creature_race = []
    for creature in creatures:
        creature_race.append(creature["race"].title())
    return creature_race


def print_creature_race():
    creature_race = get_creature_race()
    print(creature_race)


def add_creature(race, sex):
    creature = {"race": race, "creature_sex": sex}
    creatures.append(creature)


def save_file(creature):
    try:
        f = open("creatures.txt", "a")
        f.write(creature + "\n")
        f.close()
    except Exception:
        print("Could not save file")


def read_file():
    f = open("creatures.txt", "r")
    for creature in f.readlines():
        add_creature(creature)
    f.close()


read_file()
print_creature_race()


creature_race = input("Enter creature race: ")
creature_sex = input("Enter creature sex: ")

add_creature(creature_race, creature_sex)
print_creature_race()
save_file(creature_race)

当我尝试运行时,我得到以下内容:

...line 32, in read_file
    add_creature(creature)
TypeError: add_creature() missing 1 required positional argument: 'sex'

第32行是read_file()函数定义中的第4行:

add_creature(creature)

如果我将鼠标悬停在最右边的括号上')'我得到:

Parameter 'sex' unfilled

如果我把第二个参数放在:

def read_file():
    f = open("creatures.txt", "r")
    for creature in f.readlines():
        add_creature(creature, sex)
    f.close()
    print("Could not read file")

我明白了:

line 32, in read_file
    add_creature(creature, sex)
NameError: name 'sex' is not defined

当我将鼠标悬停在性爱上时,它会给我:

Unresolved reference sex

如果我在def read_file()周围放置一个try块,那么我可以运行该程序而不会出错:

def read_file():
    try:
        f = open("creatures.txt", "r")
        for creature in f.readlines():
            add_creature(creature, sex)
        f.close()
    except Exception:
        print("Could not read file")

并运行它我得到以下内容:

Could not read file
[]
Enter creature race: giant
Enter creature sex: male
['Giant']

Process finished with exit code 0

第一行是read_file()函数的异常,因为creatures.txt还不存在(或者我认为)。 []是print_creature_race()函数的输出,因为它当前为空。接下来的两个“Enter ...”语句应该是不言自明的。 ['Giant']是第二次print_creature_race()函数调用的输出。我现在有一个creatures.txt文件,里面有“巨人”这个词。

现在,根据教程,如果我第二次运行这个,我应该得到的是:

giant

Enter creature race: elf
Enter creature sex: female

没有例外,因为文件creatures.txt现在存在。 print_creature_race()函数调用导致打印“巨型”。我得到两个提示进入另一场比赛和性别。但是,我实际得到的是:

Could not read file
[]
Enter creature race: 

如果我继续提示,我会得到:

Could not read file
[]
Enter creature race: elf
Enter creature sex: female
['Elf']

我的creatures.txt文件有巨人和精灵(每个都在自己的行上),但显然,我仍然无法读取该文件。 add_creature的定义有两个参数,但是包含它并且不包括它都会出错。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

请了解如何调试代码! 我只是给出一些提示。然而,这些并不会导致成功(正如Paul Cornelius指出的那样)

修复最后一行:

save_file(creature_race)

save_file(creatures)

简要说明: 你只保留种族,而你的职能等待:种族和性别。

您还应该查看hot以适当地将数据保存在文件中并阅读。 (例如检查python + csv)。

另外:你创建的函数很糟糕 - 它们没有封装。尝试以某种方式重新考虑代码,您的所有函数都不必调用或更改外部变量。然后,您可以在不执行任何功能的情况下启动代码,并逐个调用它们以查看它们的功能。观察您的全局变量,并随时修改代码。

答案 1 :(得分:0)

我弄明白了这个问题。我错过了代码中的一个小细节。在add_creature()定义中,我必须为sex分配一个默认值:

def add_creature(race, sex="male"):
    creature = {"race": race, "creature_sex": sex}
    creatures.append(creature)

这就是本教程只能使用race参数调用该函数的方法。添加="male"代码后,代码按预期工作。