2017-07-21 2 views
0

私が持っている三つのファイルとフォルダ:は自分の時間モジュールをPythonのtimeモジュールをシャドウすることはできません

  • test.py
  • time.py
  • datetime.py

time.pyとdatetime.pyは同じです:

def ticks_ms(): 
    return 5 

when test.py次のようになります。

import datetime as t 
print(t.ticks_ms()) 

それは5を印刷し、私はそれを変更する場合:

import time as t 
print(t.ticks_ms()) 

私が手:

AttributeError: module 'time' has no attribute 'ticks_ms' 

なぜ私はdatetimeモジュールではなく、時間モジュールをシャドウすることができます?

+2

組み込みのモジュールを故意に隠すのはひどい考えです。なぜあなたはそれをしたいのですか? –

+0

"理由"についてはわかりませんが、ここでは "方法"です:あなたのモジュールに "my_time.py"という名前をつけて、この方法でインポートしてください: 'import my_time as time'。 –

+0

なぜ私はこれをやりたいのですか: 私はマイクロpythonを使ってプロジェクトを進めています。マイクロプロセッサーで使用可能な時間モジュールのバージョンには、プロセッサーが開始してからのミリ秒数を返すticks_ms()関数があります。私が自分のコンピュータに書いているコードを開発するときに、コードをマイクロプロセッサにアップロードしなくても簡単にテストできるようにするために、私はすべての車載用のモジュールをシミュレートしました。通常の時間モジュールにはticks_ms()関数がありません。マイクロソフトでインポートが機能しないため、何か他の名前を付けることはできません。 – Stefan

答えて

2

なぜ私はdatetimeモジュールではなく、timeモジュールをシャドウすることができますか?

Pythonが最初に通常.pyファイルを検索する前に、(Cで実装)の組み込みモジュールを検索しますので(さまざまな場所で、あなたのcwdから始まる、sys.pathの内容を参照してください)。

あなたはモジュールのインポートが(sys.modulesで発見されていないモジュール)が発生した場合に照会されているファインダーが含まれているsys.meta_pathを検査することで、これを見ることができます:

>>> sys.meta_path 
[<class '_frozen_importlib.BuiltinImporter'>, 
<class '_frozen_importlib.FrozenImporter'>, 
<class '_frozen_importlib_external.PathFinder'>] 

まずこのリストにあるBuiltinImporter名前の通り、組み込みモジュールの発見を処理します。

>>> time 
<module 'time' (built-in)> 

とあなたのtime.pyの検索が実行される前に発見された:

時間モジュールは、(これらのリストについてはsys.builtin_module_namesを参照)で、内蔵されています。 (sys.pathに記載されているエントリを見て、PathFinder発見datetime.py

>>> datetime 
<module 'datetime' from '/home/jim/anaconda3/lib/python3.6/datetime.py'> 

ので、あなたの現在の作業ディレクトリのマスクそれでdatetime.pydatetime.pyではないが。


はい、あなたができる再オーダーsys.meta_pathでファインダーをして置くことにより、PathFinderたばかりtime.pyその結果が、あなただけ:-)実験していない限り、(それをしないでください最初。

関連する問題