Reputation: 23634
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
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
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:
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)
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
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
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