Python:这些代码有什么作用? “Module = type(sys)”

时间:2013-04-02 03:38:17

标签: python-2.7

我在某处看到了一些用于配置的python代码,但我无法理解。

这是代码:

import sys, os.path

Module = type(sys) # What does this line for? 

modules = {}

print dir(Module)

def load(fullpath, env={}, module=Module):
    try:
        code = open(fullpath).read()
    except IOError:
        raise ImportError, 'No module named %s' % fullpath

    filename = os.path.basename(fullpath)

    try:
        return modules[filename]
    except KeyError:
        pass

    #################################### 
    #### Most confused 

    m = module(filename) 
    m.__module_class__ = module
    m.__file__ = fullpath

    m.__dict__.update(env)

    exec compile(code, filename, 'exec') in m.__dict__
    ####################################

    modules[filename] = m

    return m


def unload(m):

    filename = os.path.basename(m.__file__)
    del modules[filename]

    return None


def reload(m):
    fullpath = m.__file__

    try:
        code = open(fullpath).read()
    except IOError:
        raise ImportError, 'No module named %s' % fullpath

    env = m.__dict__
    module_class = m.__module_class__

    filename = os.path.basename(fullpath)
    m = module_class(filename)

    m.__file__ = fullpath
    m.__dict__.update(env)
    m.__module_class__ = module_class

    exec compile(code, filename, 'exec') in m.__dict__
    modules[filename] = m

    return m
  1. 我无法理解为什么要使Module = type(sys)
  2. var m及其buildin方法做了什么,我在哪里可以找到doc?
  3. 为什么要定义一个dict var?

1 个答案:

答案 0 :(得分:2)

在该行上方的代码中:

Module = type(sys)

创建一个类型为module的变量。您可以打开解释器并键入以下代码:

import sys
Module = type(sys)
help(Module)

您将看到以下内容:

  

模块内置

中的课程模块帮助      

类模块(对象)   |模块(名称[,doc])   |
  |创建一个模块对象。   |名称必须是字符串;可选的doc参数可以包含任何类型。   |
  |这里定义的方法:   |
  |的 delattr (...)   | x。 delattr ('名称')< ==> del x.name   |
  |的的getAttribute (...)   | x。 getattribute ('名称')< ==> x.name   |
  |的初始化(...)   | x。 init (...)初始化x;请参阅帮助(类型(x))以进行签名   |
  |的再版(...)   | x。 repr ()< ==>再版(x)的   ...

加载方法,你最困惑的基本上是,将文件添加到模块m然后编译这些模块中的代码。

通过使用此代码,我不知道您要尝试实现的是什么,但有更简单的方法来动态加载模块。例如:

Dynamic loading of python modules