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