2014-12-15 4 views
8

Hintergrund: ich ein paar engen Schleifen in einem Python-Programm, das immer wieder genannt werden, die die datetime.datetime.now() Verfahren umfassen, sowie die datetime.datetime.min und datetime.datetime.max Attribute. Zur Optimierung würde Ich mag sie in den lokalen Namensraum importieren, die wiederholt werden, unnötige Modulhierarchie Name Nachschau vermeiden, etwa so:wie jetzt direkt importieren() von datetime.datetime Submodul

from datetime.datetime import now, min, max 

jedoch Python klagt:

Traceback (most recent call last): 
    File "my_code.py", line 1, in <module> 
    from datetime.datetime import now, min, max 
ImportError: No module named datetime 

Frage : Warum funktioniert der obige Submodulimport nicht?

Umgehung: Das kann ich stattdessen tun:

import datetime 
dt_now = datetime.datetime.now 
dt_min = datetime.datetime.min 
dt_max = datetime.datetime.max 

Aber, ich bin neugierig, warum der eher traditionelle Ansatz nicht funktioniert? Warum kann ich Methoden und Eigenschaften nicht direkt aus dem datetime.dateime Submodul importieren? ... Und gibt es einen Grund, die obige Problemumgehung zu vermeiden (neben Lesbarkeit, Überlisten, etc.)?

Danke!

+0

Sie sind wahrscheinlich besser dran, Max und Min sowieso nicht zu importieren, oder Sie könnten unerwartete Ergebnisse haben, wenn Sie die eingebauten Min- oder Max-Funktionen –

+0

@PadraicCunningham aufrufen, haben Sie Recht. Deshalb habe ich den Namen in meiner Problemumgehung geändert, aber ich war zu faul, "wie" hinzuzufügen, um sie in meinem ursprünglichen Beispiel umzubenennen. :) – Trevor

Antwort

9

datetime.datetime ist kein Submodul. datetime ist eine Klasse innerhalb des datetime Moduls. now ist eine Methode dieser Klasse. Sie können from...import... nicht verwenden, um einzelne Methoden einer Klasse zu importieren. Sie können damit nur einzelne Module aus einem Paket oder einzelne Objekte, die auf der obersten Ebene eines Moduls existieren, importieren.

Wie für Ihr Problem zu umgehen, wenn Sie Stenografie wollen, finde ich es besser lesbar, dies zu tun:

from datetime import datetime as dt 
dt.now() 
# you can also use dt.max, dt.min, etc. 

Wenn Sie wirklich diese Methoden direkt in lokalen Variablen setzen wollen, dann Abhilfe Sinn macht.

+0

Ahh, guter Fang! Danke, @BrenBarn! – Trevor

Verwandte Themen