导入的函数带来错误:名称未定义

时间:2016-12-19 20:36:31

标签: python

我问过几个人,找不到任何有效的问题。我的代码看起来很相似,但我正在尝试导入游戏的标题。虽然该函数在源文件中有效,但在导入到另一个文件后,找不到它。以下是cmd中的文件和结果错误:

Game.py:

from Events import *
from Character import *

Opening()

Character.py:

from Events import *
from Game import *

Events.py:

from Game import *
from Character import *

def Opening():
    print " _____       _           _____                        _____                       _                _       "
    print "/  ___|     | |         /  ___|                      /  __ \                     | |              (_)      "
    print "\ `--. _   _| |__ ______\ `--. _ __   __ _  ___ ___  | /  \/ __ _  ___ ___  _ __ | |__   ___  _ __ _  __ _ "
    print " `--. \ | | | '_ \______|`--. \ '_ \ / _` |/ __/ _ \ | |    / _` |/ __/ _ \| '_ \| '_ \ / _ \| '__| |/ _` |"
    print "/\__/ / |_| | |_) |     /\__/ / |_) | (_| | (_|  __/ | \__/\ (_| | (_| (_) | |_) | | | | (_) | |  | | (_| |"
    print "\____/ \__,_|_.__/      \____/| .__/ \__,_|\___\___|  \____/\__,_|\___\___/| .__/|_| |_|\___/|_|  |_|\__,_|"
    print "                              | |                                          | |                             "
    print "                              |_|                                          |_|                             "

但在cmd中运行Game.py文件后,会出现错误:

Traceback (most recent call last):
 File "Game.py", line 2, in <module>
   from Events import *
 File "/tmp/so/Events.py", line 2, in <module>
   from Game import *
 File "/tmp/so/Game.py", line 8, in <module>
   Opening()
NameError: name 'Opening' is not defined

1 个答案:

答案 0 :(得分:1)

您的问题是循环导入和使用&#34;导入*&#34;。

的组合

最佳解决方案是组织代码,以便您不需要循环导入。什么是循环导入?您有游戏导入事件,然后导入游戏。当您查看错误发生时正在执行的行时,您可以在stacktrace(我编辑您的问题以包含它)中看到这一点。

问题的第二部分是Python的导入机制和来自导入*&#34;的方式。作品。第一次,Game.py正在执行。遇到的第一行是from Events import *。所以python查看sys.modules并找不到模块Events。所以它开始加载Events.py。加载Events.py将按顺序执行语句。第一个陈述是from Game import *。由于Game不在sys.modules,因此会加载它。所以第一个陈述是from Events import *。如果现在这看起来很混乱,那么是的:不要进行循环进口。这一次Events位于sys.modules然而,它尚未完全初始化,因为它仍在加载中。因此,Game会在Events中找到此时定义的所有名称,但这些名称并不存在。然后它继续并尝试在当前范围内找到名为Opening的对象,但无法找到它。可以说,python一旦遇到循环导入就会崩溃,并告诉你不要这样做,但它并没有。它可能会有用,如果你格外小心,但无论如何这都是一个坏主意。