《Python核心编程》第12章 习题

12–5. 使用 __import__().
(a) 使用 __import__ 把一个模块导入到你的名称空间。 你最后使用了什么样的语法?

(b) 和上边相同, 使用 __import__() 从指定模块导入特定的名字。

module = __import__('sys',fromlist=['platform'])
platform = module.platform
print module.modules['sys']
print platform

12–6. 扩展导入。创建一个 importAs() 函数. 这个函数可以把一个模块导入到你的名称空间, 但使用你指定的名字, 而不是原始名字。 例如, 调用 newname=importAs('mymodule') 会导入mymodule , 但模块和它的所有元素都通过新名称 newname 或 newname.attr 访问。 这是 Python2.0 引入的扩展导入实现的功能。

def importAs(name):
    return __import__(name)

mysys = importAs('sys')
print mysys.path

12–7. 导入钩子。

研究 PEP 302 的导入钩子机制. 实现你自己的导入机制, 允许编码你的模块(encryption, bzip2, rot13, 等), 这样解释器会自动解码它们并正确导入。你可以参看 zip文件导入的实现 (参阅 第 12.5.7 节)。

不会做,下面代码瞎写的。先自己创建一个zzz.tar.bz2压缩包,里面包含一些普通py文件和一个__init__.py文件,__init__.py文件里定义一个__all__=[]列表包含其他py文件。然后用下面的类来导入bz2格式的压缩包里的模块。

import imp
import sys,os
import tarfile

def decompressbz2(bz2file,dstdir):
    archive=tarfile.open(bz2file,'r:bz2')
    for tarinfo in archive:
        archive.extract(tarinfo,dstdir)
    archive.close()
    return bz2file[:-8]

class bz2Importer(object):
    def __init__(self,name,decompress):
        wp=os.getcwd()
        self.last_fullname = decompress(name,wp)
        self.last_text = ''
        self.last_ispkg = False

    def find_module(self, fullname, path=None):
        wp=os.getcwd()
        moduledir=wp+os.sep+self.last_fullname
        if not fullname.endswith('.py'):
            fullname += '.py'
        if fullname in sys.modules:
            return self
        elif fullname in os.listdir(moduledir):
            if self.load_module(fullname) and fullname in sys.modules:
                return self
            else:
                return None
        else:
            return None

    def load_module(self, fullname):
        if fullname in sys.modules:
            return sys.modules[fullname]
        
        try:
            code = self.last_text
            ispkg = self.last_ispkg

            mod = sys.modules.setdefault(fullname, imp.new_module(fullname))
            mod.__file__ = "<MyImport: %s>" % fullname
            mod.__loader__ = self

            if ispkg:
                mod.__path__ = []
                mod.__package__ = fullname
            else:
                mod.__package__ = fullname.rpartition('.')[0]

            co = compile(code, mod.__file__, 'exec')
            exec(co, mod.__dict__)

            return mod
        except Exception as e:
            raise ImportError(e)

sys.meta_path.append(bz2Importer('zzz.tar.bz2',decompressbz2))
importer=bz2Importer('zzz.tar.bz2',decompressbz2)
print 'test1.py : ', importer.find_module('test1')
print 'xxx.py : ', importer.find_module('xxx')



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值