我是Python新手,我不确定放置用户定义的异常的最佳位置是什么,以及在哪里捕获它们。
例如,我有一个启动游戏的程序,当游戏停止时,会引发用户定义的异常(StopGame)。我应该从游戏外捕获这个异常,因为游戏正在抛出这个异常。虽然,例外是特定于游戏,所以异常的定义应该在游戏模块(或者游戏包?)中。
以下是该程序的简单布局:
计划结构:
__main__.py
game/
__init__.py
game.py
_ _main_ _ 的.py
import game
def main():
g = game.Game()
try:
g.start()
except game.StopGame:
print '\nbye bye!'
if __name__ == '__main__':
main()
游戏/ _ _init_ _ 的.py
from game import Game
from game import StopGame
游戏/ game.py
class Game:
def start(self):
try:
a = raw_input('do you want to play?\n')
print 'cool'
except (KeyboardInterrupt, EOFError):
raise StopGame
if a == 'no':
raise StopGame
else:
print 'cool'
class StopGame(Exception):
pass
这段代码很好用,我只是不确定这是不行的方法。我觉得有点令人失望的是我应该使用此设置导入游戏/ _ init _ .py中的每个例外。否则我应该抓住例外:
except game.game.StopGame
这看起来有点讨厌。我认为最好能够从 _ main _ .py中的变量'game'到达模块'游戏'中的所有属性。然后我知道你可以把它放在游戏/ _ init _ .py:
from game import *
哪个会从game / game.py导入所有类,但我听说使用*进行导入是一种不好的做法。
所以,我的问题是,最好的方法是什么?也许我的整个设置是错误的,如果是这样,我想听听正确的设置。
提前多多感谢!
BTW:如果你可能想知道我为什么在游戏包里面有一个游戏模块:想法是这个包将包含许多与游戏相关的模块,game / game.py只是它的发起者整个游戏,也许我应该将该代码放入游戏/ _ init _ .py?答案 0 :(得分:5)
我认为解决问题的最佳方法是查看实际的Python包,看看它是如何构建的。我将以excellent python-requests package为例。
该模块是关于发出HTTP请求的。你的是玩游戏。
基本HTTP请求功能导入requests/__init__.py
文件,但在其他地方定义。这就是你正在做的事情,但其他地方'可以有一个更好的名字。也许game/core.py
可能是合适的。
例外在requests/exceptions.py
文件中定义。通常情况下,相对较小的包装适用于一个地方的所有例外情况
请注意,异常也会导入requests/__init__.py
!这使得它们更容易在其他可能需要捕获它们的包中导入!
最后,没有使用from module import *
。它不会花太多时间来实际添加所需的内容,因此您应该避免使用*
。
game/game.py
文件,将其称为game/core.py
或其他内容game/exceptions.py
文件game/__init__.py
中,导入您的软件包中通常需要的内容:主要类和例外。