web-dev-qa-db-ja.com

AttributeError:モジュール 'datetime'に属性 'now'がありません

私は自分でPython=を学んでいます。今、私はいくつかの問題に遭遇しました。以下は、うまく動いているビデオからコピーした私のコードです。

_import datetime

print(type(datetime))
d1 = datetime.datetime.now()
print(d1)
_

pycharm&sublimeを使用してコードを実行すると、エラーが発生しました。以下は崇高なのエラー情報です

_<class 'module'>
Traceback (most recent call last):

  File "D:\programming\python\datetime.py", line 1, in <module>
    import datetime

  File "D:\programming\python\datetime.py", line 4, in <module>
    d1 = datetime.datetime.now()

AttributeError: module 'datetime' has no attribute 'now'
_

以下はpycharmのエラー情報です

_D:\programming\python\venv\Scripts\python.exe C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\pydevconsole.py" 63029 63030
<class 'module'>
Traceback (most recent call last):

  File "C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\pydevconsole.py", line 4, in <module>
    from _pydev_imps._pydev_saved_modules import thread

  File "C:\Program Files\JetBrains\PyCharm 2018.1.2\helpers\pydev\_pydev_imps\_pydev_saved_modules.py", line 21, in <module>
    import xmlrpc.client as xmlrpclib

  File "D:\programming\Anoconda3\lib\xmlrpc\client.py", line 134, in <module>
    from datetime import datetime

  File "D:\programming\python\datetime.py", line 4, in <module>
    d1 = datetime.datetime.now()

AttributeError: module 'datetime' has no attribute 'now'
Process finished with exit code 1
_

このコードは、IDLEとcmdの下で適切に実行されます。 print(type(datetime))をコーディングしただけでも問題なく実行されていますが、倍のタイプの日時を出力します。

どうすればいいのかわかりません。アドバイスをお願いします。ありがとう。

4
Yq Lee

編集**:ユーザー独自のカスタムdatetime.pyモジュールが標準ライブラリをオーバーライドしていました。以下の情報は、それが発生する理由を理解するのに役立ちます。インポートアルゴリズムはまず、直接のディレクトリをチェックします。次のコマンドでモジュールファイルのパスを確認できます。

print a_module.__file__

プログラミングの野生の世界へようこそ。だから私はあなたの質問を完全に理解しているとは思えないので、私はいくつかのことを分解して、あなたが議論する余地を残すようにします。

日時をインポートすると、モジュールと呼ばれるものをインポートします。あまり詳細なモジュールに踏み込むことなく名前空間と呼ばれるものは、階層の下に属性の分離を作成するのに役立つため、インポート時に他のコードを誤って上書きすることはありません。あなたはそれについてもっと読むことができます:

https://docs.python.org/3/tutorial/modules.html

Datetimeモジュールは、単純な方法と複雑な方法の両方で日付と時刻を操作するためのクラスを提供します。日付と時刻の計算はサポートされていますが、実装の焦点は、出力のフォーマットと操作のための効率的な属性抽出です。関連する機能については、時間とカレンダーのモジュールもご覧ください。

インポートしてtypeメソッドを実行すると、次の結果が表示されます。

>>>import datetime
>>> type(datetime)
<class 'module'>

組み込み型メソッドのドキュメントには、次のように記載されています。

4.12.6。タイプオブジェクトタイプオブジェクトは、さまざまなオブジェクトタイプを表します。オブジェクトのタイプは、組み込み関数type()によってアクセスされます。型には特別な操作はありません。標準モジュールタイプは、すべての標準組み込みタイプの名前を定義します。

その出力を明示的に印刷すると、同じ結果になります。

 >>> print(type(datetime))
<class 'module'>

モジュールはインポート時にattributesを公開します。アクセスしている属性は、たまたま同じ名前のclassであるdatetimeモジュールのdatetime属性です。したがって、アクセスすると、datetime.datetimeのようになります。

そのクラスは、「now」という名前のmethod(モジュールではなくクラスの属性でもある)をサポートしています。そのため、そのメソッドにアクセスしている場合、それを呼び出すのはdatetime.datetime.now()のようになります。

インポート時にこの階層を単純化したい場合は、datetimeモジュールからdatetimeクラスのみを取得することを明確にできます。

from datetime import datetime
#and the access its now method simpler
d1 = datetime.now()

これは属性アクセスの問題を解決するのに役立つかもしれませんが、混乱の問題かもしれません。問題をさらに明確にしたい場合は、遠慮なくお伝えください。

これがお役に立てば幸いです。

8
csevier

datetimeの代わりに_datetimeをインポートするだけです

サンプルコード:

import _datetime

today = _datetime.date.today()

print(today)
4
user10061998