我是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()
game/ _ _init_ _ .py
from game import Game
from game import StopGame
game/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?
在其他地方如何完成?
我认为回答您的问题的最佳方法是查看实际的Python软件包,看看它是如何构建的。我以出色的Python-Requests软件包为例。
此模块是关于提出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
中,导入您的软件包通常需要的内容:主要类和例外。