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 № 1Wedł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.