How to make the `import datetime` statement bind the datetime type instead of the datetime module?

After accidentally typing too many times import datetimewhen it was really necessary, it was from datetime import datetime, I wondered if it was possible to hack and force the first to take up the last.

That is, to recreate this behavior (in a recently opened interpreter session):

$ python -ic ''
>>> import datetime
>>> datetime(2016, 5, 27)
datetime.datetime(2016, 5, 27, 0, 0)

Approaching the fake "called module" below:

>>> import dt
>>> dt(2016, 5, 27)
datetime.datetime(2016, 5, 27, 0, 0)

What was implemented as follows:

# dt.py
import sys
import datetime

class CallableModule(object):
    def __init__(self, thing):
        self.thing = thing
    def __call__(self, *args, **kwargs):
        return self.thing.__call__(*args, **kwargs)

sys.modules['dt'] = CallableModule(datetime.datetime)

However, this will not work if I try to use the file name datetime.pyfor the module, and I have not yet been able to find a hack to get the built-in datetime module when my own file was also named datetime.py,

? - ​​ datetime (, , sys.__stdout__ sys.stdout)?

. , - , .

+4
2

:

datetime.py:

import sys
import imp
import os

path = [p for p in sys.path if p != os.path.dirname(__file__)]
f, pathname, desc = imp.find_module('datetime', path)
std_datetime = imp.load_module('datetime', f, pathname, desc)
# if this^ is renamed to datetime, everything breaks!
f.close()

class CallableModule(object):

    def __init__(self, module, fn):
        self.module = module
        self.fn = fn

    def __call__(self, *args, **kwargs):
        return self.fn(*args, **kwargs)

    def __getattr__(self, item):
        try:
            return getattr(self.fn, item)
        except AttributeError:
            return getattr(self.module, item)

sys.modules['datetime'] = CallableModule(std_datetime, std_datetime.datetime)

test.py ( datetime.py):

import datetime

print(datetime(1, 2, 3))
print(datetime.timedelta(days=1))
print(datetime.now())

test.py, :

0001-02-03 00:00:00
1 day, 0:00:00
2016-05-27 23:16:30.954270

from datetime import datetime, timedelta ..

. , , IPython. datetime.py .

, , std_datetime ( datetime) datetime, datetime.datetime , datetime is datetime.datetime is datetime.datetime.datetime .... - , , .

( , - , )

+7

python3:

# datetime.py
import sys, _datetime
sys.modules['datetime'] = _datetime.datetime
+2

All Articles