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

25,015

Solution 1

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'

Solution 2

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.

Share:
25,015
john2x
Author by

john2x

twitter, github, bitbucket account: john2x

Updated on February 12, 2020

Comments

  • john2x
    john2x about 4 years

    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