Questions on "import" and "datetime"

Zachary Ware zachary.ware+pylist at gmail.com
Mon Jun 10 13:01:30 EDT 2013


On Mon, Jun 10, 2013 at 10:37 AM, Yunfei Dai <yunfei.dai.sigma at gmail.com> wrote:
> Hi all,

Hi Yunfei,

>
> I have some questions on "import":
>
> 1."from datetime import datetime" works well. But I am confused why "import datetime.datetime" leads to importerror. "from xlrd import open_workbook" could be replaced by "from xlrd.open_workbook" without any problem.

I assume you mean "import xlrd.open_workbook" here, as "from
xlrd.open_workbook" would be a SyntaxError :)

> The only difference here is that if "from xlrd import open_workbook" is used we do not have to write "xlrd.open_workbook" in the following code but just "open_workbook". So my understanding of the difference is "from...import..." shortens the code (just like "using namespace std" in C++) but maybe leads to name clash.

"from ... import ..." imports an object from a module and assigns it
to a local name that is the same as the name in the other module.  In
other words, the following two examples do the same thing:

from foo import bar

import foo;bar = foo.bar

If foo.bar happens to be a module (module 'bar' in package 'foo'), you
could also do this:

import foo.bar as bar

...and that restriction is where your problem lies.

> But what is the problem of datetime?

I'm not familiar with xlrd, but I believe the difference between
xlrd.open_workbook and datetime.datetime would be that
xlrd.open_workbook is a module in a package, while datetime.datetime
is a class in a module.  'from ... import ...' can import any object
from the target module/package, and assign it to a local name.
'import ...' on the other hand can only import a module (you'll notice
the ImportError you get when you try 'import datetime.datetime' is 'No
module named datetime'.  This particular example is a bit confusing
due to there being a class in a module of the same name, but try
'import datetime.date' for a clearer message.

> 2.I am also comfused that "datetime.datetime" is a function but whithin "datetime.datetime" there are lots of other functions. So what is the type of "datetime.datetime" on earth? is it a function, or a class or a folder(library) here?

datetime.datetime is actually a type of type 'type' (as can be seen
with 'import datetime;type(datetime.datetime)').  In Python 2, this
means it is a new-style class (meaning it is a subclass of 'object').
In Python 3, it's just a class (since there are no longer old-style
classes).

> Thanks very much in advance! Very looking forward to your answers.
>
> Best,
> Yunfei
>

I hope I have actually answered your question and not just muddied
things further for you.  You can of course ask again if I've made
things worse :)

-- Zach



More information about the Python-list mailing list