2013-03-29 19 views
20

Ho uno script che ha bisogno di eseguire il seguente a diverse linee nello script:python "import datetime" v.s. "Da datetime import datetime"

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

Nelle mie istruzioni import Ho il seguente:

from datetime import datetime 
import datetime 

ottengo il seguente errore:

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

Se cambio l'ordine delle istruzioni di importazione a:

import datetime 
from datetime import datetime 

ottengo il seguente errore:

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

Se ho di nuovo cambiare l'istruzione import per:

import datetime 

ottengo il seguente errore:

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

Che cosa è sta succedendo qui e come faccio a lavorare entrambi? Apprezzalo. Grazie.

+0

C'è un metodo * no * 'strp' su' datetime.datetime' * o *, probabilmente si intendeva invece 'datetime.datetime.strptime()'. –

risposta

38

Il tuo problema è che avete un po 'di codice che si aspetta datetime ad essere un riferimento al datetimemodulo e altri codici che si aspetta datetime ad essere un riferimento alla classe datetime. Ovviamente, non può essere entrambi.

Quando si esegue:

from datetime import datetime 
import datetime 

Stai prima impostazione datetime ad essere un riferimento alla classe, poi subito impostandolo a essere un riferimento al modulo. Quando lo fai al contrario, è la stessa cosa, ma finisce per essere un riferimento alla classe.

È necessario rinominare uno di questi riferimenti. Per esempio:

import datetime as dt 
from datetime import datetime 

Quindi è possibile modificare i riferimenti in forma datetime.xxxx che si riferiscono al modulo a dt.xxxx.

Oppure solo import datetime e modificare tutti i riferimenti per utilizzare il nome del modulo. In altre parole, se qualcosa dice semplicemente datetime(...) è necessario modificare tale riferimento a datetime.datetime.

Python ha un bel po 'di questo genere di cose nella sua libreria, sfortunatamente. Se hanno seguito le proprie linee guida per la denominazione in PEP 8, la classe datetime si chiamerebbe Datetime e non ci sarebbe alcun problema nell'utilizzare sia datetime che il modulo e Datetime nel significato della classe.

+1

rinominare il modulo non sembra una buona opzione. Utilizza "import data ora" o "dall'ora di data e ora", non entrambe. – jfs

+0

Penso che la cosa migliore sia fare semplicemente importare datetime, e quindi quando si usa la classe, fare datetime.datetime. In questo modo il codice è chiaro e meno soggetto a errori. È fastidioso portare datetime.datetime su tutto il codice ma la scarsa denominazione di questa libreria non lascia alcuna opzione per motivi di chiarezza IMO. – Dnaiel

18

Non è possibile utilizzare entrambe le istruzioni; il modulo datetime contiene un datetimetipo. Il nome locale datetime nel proprio modulo può fare riferimento solo a uno o l'altro.

Usa soloimport datetime, quindi assicurarsi di utilizzare sempre datetime.datetime per fare riferimento al tipo di contenuto:

import datetime 

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

Ora datetime è il modulo, e si riferiscono ai tipi di contenuti attraverso tale.

In alternativa, l'importazione tutti i tipi necessari dal modulo:

from datetime import date, datetime 

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

Qui datetime è il tipo dal modulo. date è un altro tipo, dallo stesso modulo.

+2

Grazie mille Martijn. Sta confondendo il motivo per cui hanno chiamato un tipo con lo stesso nome del modulo. Sono un principiante con Python e lo sviluppo in generale, quindi forse questa è una sorta di best practice. In ogni caso grazie gentilmente. – codingknob

0

provare questo:

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() non esiste. Penso che tu intenda il periodo di tempo.

+0

È diverso da fare semplicemente 'dt = datetime.datetime'? – Eric

+0

@Eric: No, ha lo stesso effetto. – BrenBarn

2

datetime è un modulo che contiene un tipo chiamato anche datetime. Sembra che tu voglia usare entrambi, ma stai cercando di usare lo stesso nome per riferirti ad entrambi. Il tipo e il modulo sono due cose diverse e non è possibile fare riferimento ad entrambi con il nome datetime nel programma.

Se è necessario utilizzare qualsiasi cosa dal modulo oltre al tipo datetime (come apparentemente si fa), è necessario importare il modulo con import datetime. È quindi possibile fare riferimento al tipo "data" come datetime.date e il tipo datetime come datetime.datetime.

Si potrebbe anche fare questo:

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

Qui si importano solo i nomi è necessario (i datetime e data i tipi) e importarli direttamente in modo che non è necessario fare riferimento al modulo stesso a tutti .

In definitiva, è necessario decidere quali nomi del modulo è necessario utilizzare e il modo migliore per utilizzarli. Se si utilizzano solo una o due cose dal modulo (ad esempio, solo i tipi date e datetime), potrebbe essere opportuno importare tali nomi direttamente. Se stai usando molte cose, è probabilmente meglio importare il modulo e accedere alle cose al suo interno usando la sintassi del punto, per evitare di ingombrare il tuo spazio dei nomi globale con nomi specifici della data.

Si noti anche che, se si fa importare il nome del modulo stesso, è possibile abbreviare il nome per facilitare la digitazione:

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

La differenza tra da datetime datetime importazione e normale datetime di importazione è che, si sta trattando con un modulo in una volta e una classe in un'altra.

La funzione strptime esiste solo nella classe datetime, quindi è necessario importare la classe con il modulo, altrimenti è necessario specificare due volte datetime quando si chiama questa funzione.

La cosa qui è che, il nome della classe e il nome del modulo è stato dato lo stesso nome in modo da creare un po 'di confusione.