it-swarm.com.de

python "import datetime" v.s. "von datetime import datetime"

Ich habe ein Skript, das Folgendes in verschiedenen Zeilen des Skripts ausführen muss:

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

In meinen Importanweisungen habe ich Folgendes:

from datetime import datetime
import datetime

Ich erhalte folgende Fehlermeldung:

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

Wenn ich die Reihenfolge der Importanweisungen ändere,

import datetime
from datetime import datetime

Ich erhalte folgende Fehlermeldung:

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

Wenn ich die import-Anweisung erneut in

import datetime

Ich erhalte folgende Fehlermeldung:

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

Was ist hier los und wie bekomme ich beides zur Arbeit? Bin dankbar. Vielen Dank. 

32
codingknob

Ihr Problem ist, dass Sie über einen Code verfügen, der erwartet, dass datetime eine Referenz auf datetimemodule ist, und auf anderen Code, der datetime als Referenz auf die datetime-Klasse erwartet. Natürlich kann es nicht beides sein. 

Wenn Sie das tun:

from datetime import datetime
import datetime

Sie setzen zunächst datetime als Referenz auf die Klasse und dann sofort als Referenz auf das Modul. Wenn Sie es andersherum machen, ist es dasselbe, aber es wird ein Verweis auf die Klasse.

Sie müssen eine dieser Referenzen umbenennen. Zum Beispiel:

import datetime as dt
from datetime import datetime

Dann können Sie Verweise in der Form datetime.xxxx, die sich auf das Modul beziehen, in dt.xxxx ändern.

Oder import datetime und ändern Sie alle Referenzen, um den Modulnamen zu verwenden. Mit anderen Worten, wenn etwas nur datetime(...) sagt, müssen Sie diese Referenz in datetime.datetime ändern.

Python hat leider einiges davon in seiner Bibliothek. Wenn sie ihren eigenen Namensrichtlinien in PEP 8 folgen, würde die datetime-Klasse Datetime heißen, und es wäre kein Problem, beide datetime für das Modul und Datetime für die Klasse zu verwenden.

58
kindall

Sie können nicht beide Anweisungen verwenden. Die datetimeModul enthält eine datetimeTyp. Der lokale Name datetime in Ihrem eigenen Modul kann sich nur auf das eine oder das andere beziehen.

Verwenden Sie onlyimport datetime und stellen Sie sicher, dass Sie immer datetime.datetime verwenden, um auf den enthaltenen Typ zu verweisen:

import datetime

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

Nun ist datetime das Modul und Sie beziehen sich auf die enthaltenen Typen.

Alternativ importieren Sie alle Typen, die Sie aus dem Modul benötigen:

from datetime import date, datetime

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

Hier ist datetime der Typ aus dem Modul. date ist ein anderer Typ aus demselben Modul.

23
Martijn Pieters

datetime ist ein Modul, das einen Typ enthält, der auch als datetime bezeichnet wird. Sie möchten beides verwenden, aber Sie versuchen, auf denselben Namen zu verweisen. Der Typ und das Modul sind zwei verschiedene Dinge und Sie können sich nicht auf beide mit dem Namen datetime in Ihrem Programm beziehen.

Wenn Sie außer dem datetime-Typ etwas aus dem Modul verwenden müssen (wie Sie es offensichtlich tun), müssen Sie das Modul mit import datetime importieren. Sie können dann auf den Typ "Datum" als datetime.date und den Datetime-Typ als datetime.datetime verweisen.

Sie könnten dies auch tun:

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

Hier importieren Sie nur die Namen, die Sie benötigen (Datums- und Datumstypen), und importieren Sie sie direkt, sodass Sie sich nicht auf das Modul selbst beziehen müssen.

Letztendlich müssen Sie entscheiden, welche Namen aus dem Modul verwendet werden sollen und wie diese am besten verwendet werden sollen. Wenn Sie nur ein oder zwei Elemente des Moduls verwenden (z. B. nur die Typen date und datetime), können Sie diese Namen direkt importieren. Wenn Sie viele Dinge verwenden, ist es wahrscheinlich besser, das Modul zu importieren und mithilfe der Punktsyntax auf die darin enthaltenen Elemente zuzugreifen, um zu vermeiden, dass Ihr globaler Namespace mit datumsspezifischen Namen überladen wird.

Beachten Sie auch, dass Sie den Namen des Moduls selbst importieren können, um die Eingabe zu vereinfachen:

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

Der Unterschied zwischen datetime import datetime und normaler import datetime besteht darin, dass Sie sich zu einem Zeitpunkt mit einem Modul und mit einem anderen Modul befassen.

Die Funktion strptime ist nur in der datetime-Klasse vorhanden. Daher müssen Sie die Klasse mit dem Modul importieren. Andernfalls müssen Sie datetime zweimal angeben, wenn Sie diese Funktion aufrufen.

Die Sache hier ist, dass der Klassenname und der Modulname denselben Namen erhalten haben, so dass es ein wenig Verwirrung erzeugt.

1
from datetime import datetime,timedelta
today=datetime.today()
print("Todays Date:",today)
yesterday=today-datetime,timedelta(days=1)
print("Yesterday date:",yesterday)
tommorrow=today+datetime.timedelta(days=1)
print("Tommorrow Date:",tommorrow)

versuche dies:

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 () existiert nicht. Ich denke, du meinst Stringtime.

0
Yarkee