/ / Nie można użyć datetime.strptime z importem z datetime datetime - python, python-2.7

Nie można użyć datetime.strptime z datetime importu datetime - python, python-2.7

Mam pewne wątpliwości co do części mojego kodu, który wcześniej działał (wczoraj). Korzystanie z Pythona 2.7.6

miałem

from datetime import datetime

openfor = (datetime.strptime(row[1],"%Y-%m-%d %H:%M:%S") - datetime.strptime(row[2], "%Y-%m-%d %H:%M:%S")).total_seconds()

i zwrócił wymaganą wartość. Od rana generuje

AttributeError: "module" object has no attribute "strptime"

Jeśli użyję poniżej, z importem lub bez, to działa.

openfor = (datetime.datetime.strptime(row[1],"%Y-%m-%d %H:%M:%S") - datetime.datetime.strptime(row[2], "%Y-%m-%d %H:%M:%S")).total_seconds()

Nie jest to żadna wielka sprawa, ponieważ działa, ale kod wygląda brzydko, a moja ciekawość jest podniecona. Więc jakieś sugestie, dlaczego to przestałoby działać? A jak rozwiązać? Dzięki

Odpowiedzi:

2 dla odpowiedzi № 1

Według komentarzy, instrukcja importu

from pylab import *

jest przyczyną problemu. To importuje pylab i kopiuje wszystkie nazwiska z pylab przestrzeń nazw do globalnej przestrzeni nazw bieżącego modułu. datetime jest jedną z tych nazw:

In [188]: import pylab

In [189]: "datetime" in dir(pylab)
Out[189]: True

Więc datetime zostaje przypisany do modułu, a nie do klasy.


Gdzieś pomiędzy

from datetime import datetime

i

openfor = (datetime.strptime(row[1],"%Y-%m-%d %H:%M:%S") - datetime.strptime(row[2], "%Y-%m-%d %H:%M:%S")).total_seconds()

datetime jest redefiniowane, aby dorównać modułowi datetime zamiast klasy datetime.datetime. Przyczyną tego problemu jest kod, który nie został opublikowany. (Ale wyciąg z importu, import datetime, jest prawdopodobnie sprawcą. Uważaj również, aby nie używać from module import *, ponieważ może to spowodować zanieczyszczenie przestrzeni nazw modułu wywołującego nazwami z innego modułu. Może to obejmować datetime.)


Tak poza tym, niektórzy eksperci zalecają nigdy nie używam

from module import function

i zamiast tego zawsze importuje tylko moduły:

import module         # or
import module as foo

Chociaż może to być wybór stylistyczny, przestrzeganie tej zasady sprawia, że ​​niezwykle jasne jest, skąd wszystko pochodzi.