john2x
john2x

Reputation: 23634

"type object 'datetime.datetime' has no attribute 'datetime'" even with "import datetime"

I'm getting type object 'datetime.datetime' has no attribute 'datetime' errors on AppEngine, complaining about the datetime type, but my import is import datetime. There are from datetime import datetime in other files, but I don't think that should affect this file?

There's no 'accidental' re-imports, I've checked. I've checked my AppEngine logs, and it only started happening 2 days ago.

I'm using 2.7 runtime.

EDIT: Here's the line that's causing the error (note that I'm using import datetime, NOT from datetime import datetime)

task.due_at = datetime.datetime.strptime(date, '%Y-%m-%d %I:%M%p')

EDIT: Stack trace

type object 'datetime.datetime' has no attribute 'datetime'
Traceback (most recent call last):
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~wmphighrise/1.373696587983821954/myapp/handler/decorators.py", line 22, in wrapper
    return fn(*args, **kwargs)
  File "/base/data/home/apps/s~wmphighrise/1.373696587983821954/myapp/handler/api/main.py", line 1343, in post
    task.due_at = datetime.datetime.strptime(date, '%Y-%m-%d %I:%M%p')
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'

EDIT 3: Some debugging

Note: import datetime is at the top

#1st attempt
import datetime
class MyHandler():
  def get(self):
    logging.info(datetime) # => "<type 'datetime.datetime'>"

#2nd attempt
import datetime
class MyHandler():
  def get(self):
    import datetime  # explicitly re-import the module
    logging.info(datetime) # => "<module 'datetime' (built-in)>"

#3rd attempt
import datetime
class MyHandler():
  def get(self):
    logging.info(datetime) # => Throws UnboundLocalError: local variable 'datetime' referenced before assignment
                           # Is this normal? This is new to me.
    import datetime
    logging.info(datetime)

#4th attempt
import datetime
logging.info(datetime) # => "<module 'datetime' (built-in)>"
class MyHandler():
  def get(self):
    logging.info(datetime) # => "<type 'datetime.datetime'>"

Is there a way for a variable to be redefined outside the current file or module? Because I've looked and looked at this file and there's no redefining at all.

EDIT 4:

I've ack'd "datetime =", "datetime=", "datetime.datetime =" and "datetime.datetime=", but there's no results that does reassigning. I've checked my git log for the last 2 days, and there's no changes that could've introduced it

Upvotes: 3

Views: 27828

Answers (4)

tyler
tyler

Reputation: 91

I wanted to convert a custom date to datetime and this worked for me:

end_date = '2025-12-31'
end_date = datetime(2025, 12, 31)
end_date= end_date.date()

Upvotes: 0

laike9m
laike9m

Reputation: 19328

If I understand you correctly, you are asking about the UnboundLocalError error in the following code snippet. Am I right?

#3rd attempt
import datetime
class MyHandler():
    def get(self):
        logging.info(datetime) # => Throws UnboundLocalError: local variable 'datetime' referenced before assignment
                           # Is this normal? This is new to me.
        import datetime
        logging.info(datetime)

If so, the error is quite obvious. Two things you should understand:

  1. All namespace changes (assignment,del,import,def,class) happen in the local scope(i.e. in the current scope in which the namespace-changing code executes)

  2. import X imports the module X, and creates a reference to that module in the current namespace. i.e. import changes namespace.

Though name datetime did refer to the same object(module datetime) before and after you call import datetime in function get, but those two datetime are in different scope(first one global, second one local).

Once Python detect that there is a name(in your case "datetime") in local scope, it will raise error if you use the name before your local name binding.

>>> import datetime
>>> def get():
        print(dir())

>>> get()
[]
>>> def get():
        import datetime
        print(dir())

>>> get()
['datetime']
>>> 

Hope it helps.

Upvotes: 1

mhlester
mhlester

Reputation: 23221

The code you've included works for me, so the problem is likely that you've shadowed the datetime module with a datetime.datetime object called datetime. No seriously, I meant to type all that.

>>> import datetime
>>> datetime = datetime.datetime.now()  # waves goodbye to datetime module!
>>> task.due_at = datetime.datetime.strptime(date, '%Y-%m-%d %I:%M%p')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'datetime.datetime' object has no attribute 'datetime'

Upvotes: 6

Liyan Chang
Liyan Chang

Reputation: 8051

I've always gotten a chuckle out of saying datetime.datetime, but you've taken it even further and asked python for datetime.datetime for it's attribute datetime. :D

And of course, python doesn't have a datetime.datetime.datetime

Upvotes: 0

Related Questions