

初めまして現在パッケージimportの書き方について悩んでおります。  
`__init__.py`の書き方が悪いのか  
`cmd.py` から `errors.py` のエラークラスを呼んでくる事が出来ません

ネットにて調べてみたのですがどうしても分からず質問させて頂きます  
どなたかわかる方がいらっしゃればご教授下さい

main.py

[code]

    from Utilities.output import Logs
    
[/code]

Utilities.__init__.py

[code]

    #-*-coding:utf-8-*-
    
    from Utilities import errors
    from Utilities import cmd
    from Utilities import output
    from Utilities import outs
    
    
    from Utilities.errors import BaseError
    from Utilities.errors import UnusableError
    from Utilities.errors import UnExpectedError
    
    from Utilities.errors import InputError
    from Utilities.errors import StatusError
    
    from Utilities.output import Logs
    
    from Utilities.cmd import Command
    
    from Utilities.outs import trading
    from Utilities.outs import initialize
    
[/code]

errors.py

[code]

    #-*-coding:utf-8-*-
    
    from Utilities.output import Logs
    
    log = Logs()
    
    # 全ての基本となるエラー
    class BaseError(Exception):
        def __init__(self,message):
            log.Error(message)
    
    # 使用出来ないエラー
    class UnusableError(BaseError): pass
    
    # 予期せぬエラー
    class UnExpectedError(BaseError): pass
    
    # 入力形式エラー
    class InputError(BaseError): pass
    以下省略
    
[/code]

TrackBack

[code]

        Traceback (most recent call last):
      File "c:\user\dev\main.py", line 1, in <module>
        from Utilities.output import Logs
      File "c:\user\dev\Utilities\__init__.py", line 3, in <module>
        from Utilities import errors
      File "c:\user\dev\Utilities\errors.py", line 3, in <module>
        from Utilities.output import Logs
      File "c:\user\dev\Utilities\output.py", line 7, in <module>
        from Utilities.cmd import Command
      File "c:\user\dev\Utilities\cmd.py", line 3, in <module>
        from Utilities.errors import UnExpectedError,InputError
    ImportError: cannot import name 'UnExpectedError'
    
[/code]

[![Tree](https://i.stack.imgur.com/8Pjsc.png)](https://i.stack.imgur.com/8Pjsc.png)


CC BY-SA 4.0
2018-05-22T05:44:34.020
44149
2019-04-20T16:03:25.717
2018-05-22T06:35:23.637
19110
28613
question
python python3
パッケージimportができない: ImportError: cannot import name 'UnExpectedError'


Pythonのマニュアルには「パッケージ」のことは殆ど何も書いてないので難しく考えない方がいいようです。

`__init__.py`は、このファイルがあるディレクトリーをパッケージとして扱うので作る必要はありますが、中身は空でも構いません。一般的には、パッケージを初期化するためのコードを書きます。今回は、とりあえずは空のファイルでいいでしょう。

`cmd.py`から`errors.py`のエラークラスを呼ぶのは次のように普通に`improt`文を書けば呼べます。

[code]

    from Utilities.errors import BaseError, UnusableError, UnExpectedError
    
    class Command:
        def test():
            # 処理
            BaseError('message')
            # 処理
            UnusableError('massage')
            # 処理
    
[/code]


CC BY-SA 4.0
2018-05-22T13:44:14.370
44162
2018-05-22T13:44:14.370
15171
44149
answer


とりあえず __init__.py は今回はあまり関係なくて、errors, output,
cmdの3つのモジュールが循環参照して三つ巴状態になっているのが原因です。

  * errors: outputに依存(output.Logsを使用)
  * output: cmdに依存(エラーメッセージからcmd.Commandを使用)
  * cmd: errorsに依存(エラーメッセージからerrors.UnExpectedErrorを使用)

[![インポートの依存関係の図](https://i.stack.imgur.com/QHxdR.png)](https://i.stack.imgur.com/QHxdR.png)

cmdがerrorsをimportしようとした時にはまだerrorsのimportが完了していない状態であるため、UnExpectedErrorが参照できません。

解決するには、この三つ巴の循環参照をどこかで断ち切らなければなりません。  
例えばoutput.pyでcmd.Commandを使うのをやめればimportはできるようになります。  
（モジュールをどう設計すればよいかの話になります）


CC BY-SA 4.0
2018-05-23T02:18:00.420
44169
2018-05-23T02:18:00.420
28626
44149
answer