6

私は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 / 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

このコードはこのように正常に機能しますが、これが正しい方法かどうかはわかりません。少し残念なことに、この設定を使用してgame / _ init_.pyのすべての例外をインポートする必要あります。それ以外の場合は、次のような例外をキャッチする必要があります。

except game.game.StopGame

これは少し厄介に見えます。_ main_.pyの変数'game'からモジュール'game'のすべての属性に到達できる方が良いと思います。次に、これをゲームに入れることができることを知っています/ _ init _ .py:

from game import *

これはgame/game.pyからすべてのクラスをインポートしますが、インポートに*を使用するのは悪い習慣だと聞きました。

だから、私の質問は、これを行うための最良の方法は何ですか?たぶん私のセットアップ全体が間違っているのかもしれません、もしそうなら、私は正しいセットアップが何であるかを聞きたいです。

よろしくお願いします!

ところで:なぜ私がゲームパッケージ内にゲームモジュールを持っているのか不思議に思うかもしれません:パッケージにはゲームに関連するより多くのモジュールが含まれるという考えです、game/game.pyはゲーム全体のイニシエーターにすぎません、多分私はそのコードをgame / _ init _ .pyに入れるべきですか?

4

1 に答える 1

6

他の場所ではどのように行われていますか?

あなたの問題に答える最良の方法は、実際のP​​ythonパッケージを見て、それがどのように構築されているかを確認することだと思います。優れたpython-requestsパッケージの例を取り上げます。

このモジュールは、HTTPリクエストの作成に関するものです。あなたはゲームをすることについてです。

基本的なHTTPリクエスト機能はファイルにインポートされrequests/__init__.pyますが、他の場所で定義されています。それはあなたがしていることですが、「他の場所」はより良い名前を持つことができます。たぶんgame/core.pyぴったりかもしれません。

例外はrequests/exceptions.pyファイルで定義されています。通常、比較的小さなパッケージでは、すべての例外を1か所にまとめることが適切です。
例外もにインポートされることに注意してくださいrequests/__init__.py!これにより、それらをキャッチする必要がある可能性のある他のパッケージに簡単にインポートできます。

最後に、nofrom module import *は使用されます。実際に必要なものを正確に追加するのにそれほど時間はかからないので、避ける必要があります*


あなたの場合、あなたは何ができますか?

  • ファイルを持たないようgame/game.pyにし、それを呼び出すgame/core.pyか何か
  • 小さなパッケージの場合は、例外をgame/exceptions.pyファイルに入れます
  • game/__init__.pyで、パッケージから通常必要なもの(メインクラスと例外)をインポートします。
于 2012-11-01T19:33:50.683 に答える