58

スクリプトの別の行で次を実行する必要があるスクリプトがあります。

today_date = datetime.date.today()
date_time = datetime.strp(date_time_string, '%Y-%m-%d %H:%M')

私のimport声明では、次のように述べています。

from datetime import datetime
import datetime

次のエラーが表示されます。

AttributeError: 'module' object has no attribute 'strp'

importステートメントの順序を次のように変更すると:

import datetime
from datetime import datetime

次のエラーが表示されます。

AttributeError: 'method_descriptor' object has no attribute 'today'

もう一度importステートメントを次のように変更すると:

import datetime

次のエラーが表示されます。

AttributeError: 'module' object has no attribute 'strp'

ここで何が起こっているのか、どうすれば両方を機能させることができますか?

4

6 に答える 6

85

問題は、モジュールdatetimeへの参照であると予想されるコードと、クラスへの参照であると予想される他のコードがあることです。明らかに、両方はあり得ません。datetime datetimedatetime

あなたがするとき:

from datetime import datetime
import datetime

最初datetimeにクラスへの参照になるように設定し、次にすぐにモジュールへの参照になるように設定します。逆にすると同じことですが、クラスへの参照になってしまいます。

これらの参照のいずれかの名前を変更する必要があります。例えば:

import datetime as dt
from datetime import datetime

datetime.xxxx次に、モジュールを参照するフォーム内の参照を に変更できますdt.xxxx

またはimport datetime、モジュール名を使用するようにすべての参照を変更します。言い換えれば、単にdatetime(...)その参照をdatetime.datetime.

残念ながら、Python のライブラリにはこの種のものがかなりあります。彼らがPEP 8の独自の命名ガイドラインに従えば、datetimeクラスに名前が付けられ、モジュールとクラスのDatetime両方を意味するために問題なく使用できます。datetimeDatetime

于 2013-03-29T16:48:57.717 に答える
35

両方のステートメントを使用することはできません。datetime モジュールにはdatetime typeが含まれています。独自のモジュール内のローカル名datetimeは、どちらか一方のみを参照できます。

のみ を使用してから、含まれている型を参照するためにimport datetime常に を使用するようにしてください。datetime.datetime

import datetime

today_date = datetime.date.today()
date_time = datetime.datetime.strptime(date_time_string, '%Y-%m-%d %H:%M')

datetimeこれがモジュールであり、それを介して含まれている型を参照します。

または、モジュールから必要なすべてのタイプをインポートします。

from datetime import date, datetime

today_date = date.today()
date_time = datetime.strptime(date_time_string, '%Y-%m-%d %H:%M')

これdatetimeがモジュールの型です。date同じモジュールからの別のタイプです。

于 2013-03-29T16:44:10.177 に答える
2

from datetime import datetime と通常の import datetime の違いは、ある時点ではモジュールを扱い、別の時点ではクラスを扱っているということです。

strptime 関数は datetime クラスにのみ存在するため、モジュールを使用してクラスをインポートする必要があります。そうしないと、この関数を呼び出すときに datetime を 2 回指定する必要があります。

ここでの問題は、クラス名とモジュール名に同じ名前が付けられているため、少し混乱することです。

于 2016-01-20T05:20:02.617 に答える
2

datetimeとも呼ばれる型を含むモジュールですdatetime。両方を使用したいようですが、同じ名前を使用して両方を参照しようとしています。datetimeタイプとモジュールは 2 つの異なるものであり、プログラム内で名前を使用して両方を参照することはできません。

タイプ以外にモジュールから何かを使用する必要がある場合datetime(明らかにそうしているように)、モジュールを .xml でインポートする必要がありますimport datetime。その後、「日付」タイプを としてdatetime.date、日時タイプを として参照できdatetime.datetimeます。

これを行うこともできます:

from datetime import datetime, date
today_date = date.today()
date_time = datetime.strp(date_time_string, '%Y-%m-%d %H:%M')

ここでは、必要な名前 (datetime および date タイプ) のみをインポートし、それらを直接インポートするので、モジュール自体を参照する必要はまったくありません。

最終的には、使用する必要があるモジュールの名前と、それらをどのように使用するのが最適かを決定する必要があります。モジュールから 1 つまたは 2 つしか使用していない場合 (たとえば、datedatetimeタイプのみ)、それらの名前を直接インポートしても問題ない場合があります。多くのものを使用している場合は、モジュールをインポートし、ドット構文を使用してその中のものにアクセスして、グローバル名前空間が日付固有の名前で混乱しないようにすることをお勧めします。

モジュール名自体をインポートする場合は、名前を短くして入力しやすくすることもできます。

import datetime as dt
today_date = dt.date.today()
date_time = dt.datetime.strp(date_time_string, '%Y-%m-%d %H:%M')
于 2013-03-29T16:49:13.367 に答える
0

これを試して:

import datetime
from datetime import datetime as dt

today_date = datetime.date.today()
date_time = dt.strptime(date_time_string, '%Y-%m-%d %H:%M')

strp() は存在しません。私はあなたがstrptimeを意味していると思います。

于 2013-03-29T16:48:00.103 に答える