2013-03-29 15 views
20

Mam skrypt, który trzeba wykonać następujące czynności na różnych linii w skrypcie:python "import datetime" v.s. „Z datetime import datetime”

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

W moim sprawozdaniu przywozowych Mam następujący:

from datetime import datetime 
import datetime 

otrzymuję następujący błąd:

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

Jeśli zmienić kolejność wypowiedzi importu do:

import datetime 
from datetime import datetime 

pojawia się następujący błąd:

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

Gdybym ponownie zmienić instrukcję import do:

import datetime 

pojawia się następujący błąd:

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

Co jest dzieje się tutaj i jak mogę oboje pracować? Doceniam to. Dziękuję Ci.

+0

Istnieje metoda * no * 'strp' na' datetime.datetime' * albo *, prawdopodobnie chodziło o 'datetime.datetime.strptime()'. –

Odpowiedz

38

Twój problem jest, że masz jakiś kod, który spodziewa datetime być odniesienie do datetimemoduł i innego kodu, który spodziewa datetime być odniesienie do klasy datetime. Oczywiście nie może to być jedno i drugie.

Kiedy zrobić:

from datetime import datetime 
import datetime 

Jesteś pierwszym ustawieniu datetime być odniesienie do klasy, a następnie natychmiast ustawienie go jako odniesienie do modułu. Kiedy robisz to na odwrót, to jest to samo, ale w końcu jest to odniesienie do klasy.

Musisz zmienić nazwę jednego z tych odniesień. Na przykład:

import datetime as dt 
from datetime import datetime 

Następnie można zmienić odniesienia w postaci datetime.xxxx które odnoszą się do modułu do dt.xxxx.

Albo po prostu import datetime i zmień wszystkie odniesienia do używania nazwy modułu. Innymi słowy, jeśli coś po prostu mówi datetime(...), musisz zmienić to odniesienie na datetime.datetime.

Niestety, w bibliotece Pythona jest sporo tego typu rzeczy. Jeśli zastosują się do własnych wytycznych dotyczących nazewnictwa w PEP 8, klasa datetime będzie miała nazwę Datetime i nie będzie problemu z użyciem zarówno nazwy datetime, jak i modułu Datetime dla oznaczenia klasy.

+1

zmiana nazwy modułu nie wydaje się dobrym rozwiązaniem. Albo użyj 'import datetime' lub' from datetime import datetime', a nie obie. – jfs

+0

Myślę, że najlepiej jest po prostu importować datetime, a następnie podczas korzystania z klasy, wykonaj datetime.datetime. W ten sposób kod jest przejrzysty i mniej podatny na błędy. Uciążliwe jest noszenie datetime.datetime przez cały kod, ale złe nazewnictwo tej biblioteki nie pozostawia żadnej opcji ze względu na jasność IMO. – Dnaiel

18

Nie można używać obu instrukcji; Moduł zawiera: . Lokalna nazwa datetime w twoim własnym module może odnosić się tylko do jednego lub drugiego.

Zastosowanie tylkoimport datetime, a następnie upewnij się, że zawsze używać datetime.datetime odnieść się do zamkniętego typu:

import datetime 

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

Teraz datetime to moduł, i odnoszą się do zawartych typów za to.

Alternatywnie, import wszystkie typy trzeba z modułem:

from datetime import date, datetime 

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

Tutaj datetime to typ z modułu. date to inny typ, z tego samego modułu.

+2

Bardzo dziękuję Martijn. To mylące, dlaczego nazwali typ o tej samej nazwie co moduł. Jestem początkującym użytkownikiem Pythona i ogólnie rozwijającym się, więc może jest to jakaś najlepsza praktyka. W każdym razie dziękuję uprzejmie. – codingknob

0

spróbuj tego:

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() nie istnieje. Myślę, że masz na myśli strptime.

+0

Czy to jest inaczej niż po prostu 'dt = datetime.datetime'? – Eric

+0

@Eric: Nie, ma ten sam efekt. – BrenBarn

2

datetime to moduł zawierający typ, który jest również nazywany datetime. Wygląda na to, że chcesz użyć obu, ale próbujesz użyć tej samej nazwy, aby odnieść się do obu. Typ i moduł to dwie różne rzeczy i nie można odwoływać się do nich obu z nazwą datetime w swoim programie.

Jeśli chcesz użyć czegokolwiek z modułu poza typem datetime (co najwyraźniej robisz), musisz zaimportować moduł za pomocą import datetime. Następnie można odwołać się do typu "data" jako datetime.date i typu datetime jako datetime.datetime.

Można też to zrobić:

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

Tutaj można importować tylko nazwy trzeba (typy datetime i data) i importować je bezpośrednio, dzięki czemu nie muszą odnosić się do modułu sama w ogóle .

Ostatecznie musisz zdecydować, jakie nazwy z modułu potrzebujesz i jak najlepiej z nich korzystać. Jeśli używasz tylko jednej lub dwóch rzeczy z modułu (np. Tylko typy date i datetime), importowanie tych nazw może być w porządku. Jeśli używasz wielu rzeczy, prawdopodobnie lepiej jest zaimportować moduł i uzyskać dostęp do rzeczy wewnątrz niego za pomocą składni kropkowej, aby uniknąć zaśmiecania globalnej przestrzeni nazw za pomocą nazw specyficznych dla daty.

Należy również zauważyć, że jeśli nie importować nazwa modułu siebie, można skrócić nazwę do złagodzenia wpisując:

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

Różnica z datetime import datetime i normalnym import datetime jest to, że masz do czynienia z modułem jednocześnie i klasą na drugim.

Funkcja strptime istnieje tylko w klasie datetime, więc musisz zaimportować klasę z modułem, w przeciwnym razie musisz dwukrotnie określić datę/godzinę podczas wywoływania tej funkcji.

Chodzi o to, że nazwa klasy i nazwa modułu mają tę samą nazwę, więc tworzy trochę zamieszania.