2016-05-29 11 views
0

Ich habe mich schwer mit Python-Importen beschäftigt. Ich habe den Unterschied zwischen Import X und von X Import * hier- http://effbot.org/zone/import-confusion.htm gelesen, aber mir fällt es schwer, den Unterschied zwischen Import "Modul" und "Modul" Import * zu verstehen. Zumal der effbot-Artikel empfiehlt, beim Import mit "Modul" zu bleiben und das funktioniert hier nicht.Python Imports Explained

Dieser Code

import csv 
import time 
import datetime 

startdate = time.strptime('31-Dec-50', "%d-%b-%y") 
enddate = time.strptime('1-Jan-00', "%d-%b-%y") 

with open('Classroom Utilization.csv', 'rb') as csvfile: 
     file = csv.DictReader(csvfile, delimiter=',') 
     for row in file: 
      checkstartdate = time.strptime(row['startdate'], "%d-%b-%y") 
      checkenddate = time.strptime(row['enddate'], "%d-%b-%y") 

      if checkstartdate < startdate: 
        startdate = checkstartdate 
      if checkenddate > enddate: 
        enddate = checkenddate 

print time.strftime("%d-%b-%y", startdate) 
print time.strftime("%d-%b-%y", enddate) 

print "pre convert: " + str(startdate) 
print "pre convert: " + str(enddate) 

startdate = datetime.fromtimestamp(mktime(startdate)) 
enddate = datetime.fromtimestamp(mktime(enddate)) 

print "post convert: " + str(startdate) 
print "post convert: " + str(enddate) 

print '%s/%s/%s' % (startdate.month, startdate.day , startdate.year) 

gibt diesen Fehler zurück

File "deconflict.py", line 29, in <module> 
    startdate = datetime.fromtimestamp(mktime(startdate)) 
AttributeError: 'module' object has no attribute 'fromtimestamp' 

Aus der Dokumentation (https://docs.python.org/2/library/datetime.html?highlight=datetime#module-datetime), hat das Datetime-Objekt in dem Datetime-Modul, das Verfahren fromtimestamp, aber der Import mich nicht lassen benutze es.

Auf der anderen Seite behebt die Verwendung von Modul Import * alle Probleme. Ich verstehe zwar nicht, warum ich mit time time import * nur strptime() verwenden kann, aber mit datetime import * muss ich noch datetime.fromtimestamp angeben.

import csv 
from time import * 
from datetime import * 

startdate = strptime('31-Dec-50', "%d-%b-%y") 
enddate = strptime('1-Jan-00', "%d-%b-%y") 

with open('Classroom Utilization.csv', 'rb') as csvfile: 
     file = csv.DictReader(csvfile, delimiter=',') 
     for row in file: 
      checkstartdate = strptime(row['startdate'], "%d-%b-%y") 
      checkenddate = strptime(row['enddate'], "%d-%b-%y") 

      if checkstartdate < startdate: 
        startdate = checkstartdate 
      if checkenddate > enddate: 
        enddate = checkenddate 

print strftime("%d-%b-%y", startdate) 
print strftime("%d-%b-%y", enddate) 

print "pre convert: " + str(startdate) 
print "pre convert: " + str(enddate) 

startdate = datetime.fromtimestamp(mktime(startdate)) 
enddate = datetime.fromtimestamp(mktime(enddate)) 

print "post convert: " + str(startdate) 
print "post convert: " + str(enddate) 

print '%s/%s/%s' % (startdate.month, startdate.day , startdate.year) 

Antwort

2

In diesem speziellen Fall die datetimeModul hat eine datetimeKlasse. Es ist verwirrend, da sie den gleichen Namen haben. Wenn Sie import datetime tun, erhalten Sie ein Modul mit dem Namen datetime. Für den Zugriff auf Mitglieder dieses Moduls (wie die datetime Klasse), müssen Sie die Datei ganz qualifizieren (zB: datetime.datetime)

Zum Beispiel:

import datetime 
startdate = datetime.datetime.fromtimestamp(mktime(startdate)) 

Wenn Sie from datetime import * tun, verwiesen die Sache von datetime ist nicht das Modul, sondern die Klasse mit dem gleichen Namen. Sie erhalten das gleiche Objekt, als ob Sie from datetime import datetime tat, was bedeutet, „aus dem Datetime Modul importieren Sie die Datetime Klasse

1

das Datetime-Modul eine Datetime-Klasse in sich hat. Dies ist, wie Sie es

from datetime import * 
datetime.datetime.fromtimestamp 

oder

from datetime import datetime 
datetime.fromtimestamp 

das Zeitmodul nicht über eine Zeitklasse verwenden würde und setzt ihre Methoden direkt.

Verwandte Themen