python "import datetime" c. s. "from datetime import datetime"

J'ai un script qui doit exécuter ce qui suit à différentes lignes dans le script:

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

Dans mes instructions d'importation, j'ai ce qui suit:

from datetime import datetime
import datetime

Je reçois l'erreur suivante:

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

Si je change l'ordre des instructions d'importation à:

import datetime
from datetime import datetime

Je reçois l'erreur suivante:

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

Si je change à nouveau l'instruction import à:

import datetime

Je reçois l'erreur suivante:

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

Que se passe-t-il ici et comment puis-je obtenir les deux au travail? L'apprécier. Merci.

27
demandé sur codingknob 2013-03-29 20:42:23

5 réponses

Votre problème, c'est que vous avez un peu de code qui s'attend datetime pour être une référence à la datetime module et le code qui s'attend datetime pour être une référence à la datetime classe. évidemment, ça ne peut pas être les deux.

Quand vous faites:

from datetime import datetime
import datetime

Vous définissez d'abord datetime comme une référence à la classe, puis la définissez immédiatement comme une référence au module. Lorsque vous le faites dans l'autre sens, c'est la même chose, mais il finit par être une référence pour la classe.

, Vous devez renommer l'une de ces références. Par exemple:

import datetime as dt
from datetime import datetime

Ensuite, vous pouvez changer les références dans le formulaire {[7] } qui se réfèrent au module à dt.xxxx.

Ou bien simplement {[9] } et changez toutes les références pour utiliser le nom du module. En d'autres termes, si quelque chose dit juste datetime(...) vous devez changer cette référence à datetime.datetime.

Python a un peu de ce genre de chose dans sa bibliothèque, malheureusement. S'ils ont suivi leurs propres directives de nommage dans PEP 8 , la classe datetime serait nommée Datetime et il n'y aurait aucun problème à utiliser les deux datetime pour signifier le module et Datetime pour signifier la classe.

50
répondu kindall 2013-03-29 16:48:57

Vous ne pouvez pas utiliser les deux états; la datetime module contient un datetime type. Le nom local datetime dans votre propre module ne peut faire référence qu'à l'un ou l'autre.

Utiliser seulement import datetime, ensuite, assurez-vous de toujours utiliser datetime.datetime pour consulter les contenus de type:

import datetime

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

Maintenant datetime est le module, et vous vous référez aux types contenus via cela.

Vous pouvez également importer tous les types dont vous avez besoin à partir du module:

from datetime import date, datetime

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

Ici datetime est le type du module. date est un autre type, du même module.

21
répondu Martijn Pieters 2013-03-29 16:51:13

datetime est un module qui contient un type qui est aussi appelé datetime. Vous voulez utiliser les deux, mais vous essayez d'utiliser le même nom pour désigner à la fois. Le type et le module sont deux choses différentes et vous ne pouvez pas vous référer aux deux avec le nom datetime dans votre programme.

Si vous avez besoin d'utiliser quelque chose du module en plus du type datetime (comme vous le faites apparemment), alors vous devez importer le module avec import datetime. Vous pouvez alors vous référer au type" date " comme datetime.date et le type datetime comme datetime.datetime.

Vous pouvez aussi faire ceci:

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

Ici, vous importez uniquement les noms dont vous avez besoin (les types datetime et date) et les importez directement afin de ne pas avoir besoin de se référer au module lui-même.

En fin de compte, vous devez décider quels noms du module vous devez utiliser, et comment les utiliser au mieux. Si vous n'utilisez qu'une ou deux choses du module (par exemple, juste les types date et datetime), Il peut être acceptable d'importer ces noms directement. Si vous utilisez beaucoup de choses, il est probablement préférable d'importer le module et d'y accéder en utilisant la syntaxe dot, pour éviter d'encombrer votre espace de noms global avec des noms spécifiques à la date.

Notez également que, si vous importez le nom du module lui-même, vous pouvez raccourcir le nom pour faciliter la saisie:

import datetime as dt
today_date = dt.date.today()
date_time = dt.datetime.strp(date_time_string, '%Y-%m-%d %H:%M')
2
répondu BrenBarn 2013-03-29 16:49:13

La différence entre from datetime import datetime et normal import datetime est que , vous avez affaire à un module à la fois, et une classe à l'autre.

La fonction strptime n'existe que dans la classe datetime donc, vous devez importer la classe avec le module sinon, vous devez spécifier datetime deux fois lors de l'appel de cette fonction.

La chose ici est que, le nom de la classe et le nom du module ont reçu le même nom, donc cela crée un peu de confusuion.

1
répondu Lakshaya Maheshwari 2016-01-20 05:20:02

Essayez ceci:

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')

Gest() n'existe pas. Je pense que vous voulez dire strptime.

0
répondu Yarkee 2013-03-29 16:48:00